Created
December 20, 2018 15:43
-
-
Save worldmind/8e35110c1188fed068b8dade42696aa7 to your computer and use it in GitHub Desktop.
Ugly script for comparing objects with/without __slots__
This file contains 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
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)) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
objsize.get_deep_size as alternative way