Created
April 24, 2026 08:26
-
-
Save fsimonis/d8f888882851ebf7f181ea859a6f77c0 to your computer and use it in GitHub Desktop.
Memory footprint comparison of python classes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import sys | |
| from abc import ABC, abstractmethod | |
| class DictBase(ABC): | |
| @abstractmethod | |
| def do(self): | |
| pass | |
| class SlotBase(ABC): | |
| __slots__=() | |
| @abstractmethod | |
| def do(self): | |
| pass | |
| def make_dict_class(n: int, bases:list[type]) -> type: | |
| def __init__(self): | |
| for i in range(n): | |
| setattr(self, f"m{i}", i) | |
| def do(self): | |
| pass | |
| return type(f"DictClass_{n}", tuple(bases), {"__init__": __init__, "do": do}) | |
| def make_slots_class(n: int, bases:list[type]) -> type: | |
| slots = tuple(f"m{i}" for i in range(n)) | |
| def __init__(self): | |
| for i in range(n): | |
| setattr(self, f"m{i}", i) | |
| def do(self): | |
| pass | |
| return type(f"SlotsClass_{n}", tuple(bases), {"__slots__": slots, "__init__": __init__, "do": do}) | |
| def getsize(obj): | |
| return sys.getsizeof(obj) + ( sys.getsizeof(obj.__dict__) if hasattr(obj, "__dict__") else 0 ) + ( sys.getsizeof(obj.__weakref__) if hasattr(obj, "__weakref__") else 0 ) | |
| data = [] | |
| for n in range(50): | |
| ddict_obj = make_dict_class(n, [DictBase])() | |
| dslots_obj = make_slots_class(n, [DictBase])() | |
| sdict_obj = make_dict_class(n, [SlotBase])() | |
| sslots_obj = make_slots_class(n, [SlotBase])() | |
| dict_obj = make_dict_class(n, [])() | |
| slots_obj = make_slots_class(n, [])() | |
| ddict_size = getsize(ddict_obj) | |
| dslots_size = getsize(dslots_obj) | |
| sdict_size = getsize(sdict_obj) | |
| sslots_size = getsize(sslots_obj) | |
| dict_size = getsize(dict_obj) | |
| slots_size = getsize(slots_obj) | |
| data.append([n, ddict_size , dslots_size , sdict_size , sslots_size, slots_size, dict_size]) | |
| import pandas | |
| df = pandas.DataFrame(data, columns=["n", "dB d", "dB s", "sB d", "sB s", "s", "d"]) | |
| print(df.to_markdown(index=False)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment