2 回答

TA贡献1873条经验 获得超9个赞
基本上,pythons类和实例都是对象。当您测试的大小时MyClass(),您正在查询实例对象的内存大小,而当您针对进行查询时MyClass,您正在测试类对象的大小。
这两个对象都有各自的字段,这就是为什么大小不同的原因,并且类对象比实例需要更多的内存也就不足为奇了。
python中类的实例是一种字典,将名称与python对象(函数,字段等)相关联。实际上,它们存储在MyClass().__dict__字典中。因此,如果您向类中添加更多字段,则大小不会改变,因为该类指向__dict__依次存储这些字段的对象。
测试sys.getsizeof(MyClass().__dict__)收益率也是固定的。因为python字典将其键存储在keys列表中,并将其值存储在values列表中(具有智能哈希关联等)。
因此,如果您希望看到班级规模的增长,可以这样做:
从ipython转储
In [11]: class A():
....: def __init__(self, **kwargs):
....: for k,a in kwargs.items():
....: self.__dict__[k]=a
....:
....:
In [14]: a1 = A(a=2)
In [15]: a2 = A(a=2,b=3,c='aaaa')
In [16]: import sys
In [17]: sys.getsizeof(a1.__dict__)
Out[17]: 140
In [18]: sys.getsizeof(a2.__dict__)
Out[18]: 140
In [19]: sys.getsizeof(a1.__dict__.keys())
Out[19]: 40
In [20]: sys.getsizeof(a2.__dict__.keys())
Out[20]: 48
In [21]: sys.getsizeof(a2.__dict__.keys()+a2.__dict__.values())
Out[21]: 60
In [22]: sys.getsizeof(a1.__dict__.keys()+a2.__dict__.values())
Out[22]: 52
希望这可以为您解释一些事情。
添加回答
举报