Skip to content

Instantly share code, notes, and snippets.

@worldmind
Created December 20, 2018 15:43
Show Gist options
  • Save worldmind/8e35110c1188fed068b8dade42696aa7 to your computer and use it in GitHub Desktop.
Save worldmind/8e35110c1188fed068b8dade42696aa7 to your computer and use it in GitHub Desktop.
Ugly script for comparing objects with/without __slots__
from pympler import asizeof
def list_to_str(lst):
str = ''
for val in lst:
str = str + val + ', '
return str[0:len(str)-2]
def list_to_slots_str(lst):
str = ''
for val in lst:
str += "'{}',".format(val)
return str[0:len(str)-1]
def dict_to_str(dct):
str = ''
for name, value in dct.items():
str += "{}='{}',".format(name, value)
return str[0:len(str)-1]
class_def = '''class {}():
'''
slots_def = ''' __slots__ = {}
'''
init_def = ''' def __init__(self, {}):
'''
attr_def = ''' self.{} = '{}'
'''
for i in range(1,250):
attr_names = ['attr'+str(x) for x in range(1,i+1)]
attrs = {name: j for j,name in enumerate(attr_names)}
attrs_names_str = list_to_str(attr_names)
attrs_str = dict_to_str(attrs)
class_name = 'TheUsualClass' + str(i)
class_str = class_def.format(class_name)
class_str += init_def.format(attrs_names_str)
for attr, value in attrs.items():
class_str += attr_def.format(attr, value)
exec(class_str)
a = eval('{}({})'.format(class_name, attrs_str))
no_slots_size = asizeof.asizeof(a)
class_name = 'TheSlotsClass' + str(i)
class_str = class_def.format(class_name)
class_str += slots_def.format(list_to_slots_str(attr_names))
class_str += init_def.format(attrs_names_str)
for attr, value in attrs.items():
class_str += attr_def.format(attr, value)
exec(class_str)
a = eval('{}({})'.format(class_name, attrs_str))
with_slots_size = asizeof.asizeof(a)
print('{}. slots version: {}, no slots: {}, ratio {}: '.format( i,
round(with_slots_size,2),
round(no_slots_size,2),
round(no_slots_size/with_slots_size,2))
)
@worldmind
Copy link
Author

objsize.get_deep_size as alternative way

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment