为了账号安全,请及时绑定邮箱和手机立即绑定

python对象和类的内存布局是什么?

python对象和类的内存布局是什么?

繁华开满天机 2021-03-30 21:10:31
Python交互器为对象存储什么样的数据?例如,在如下代码中:class MyClass:    passif __name__ == "__main__":    c = MyClass()    import sys    print sys.getsizeof(c),sys.getsizeof(MyClass)为什么输出为72和104?为什么类比对象实例大?类和对象必须存储什么(占用72个字符和104个字符)?令人惊讶的是,当我运行此命令时:class MyClass:    def __init__(self):        self.mIntValue = 1024        self.mStringValue = "hust";if __name__ == "__main__":    c = MyClass()    import sys    print sys.getsizeof(c),sys.getsizeof(MyClass)输出仍然是72和104,但是我添加了两个额外的属性,因此我猜该对象应该变得“更大”。好吧,结果似乎并非如此。

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

希望这可以为您解释一些事情。


查看完整回答
反对 回复 2021-04-01

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号