猿问

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

Python交互器为对象存储什么样的数据?

例如,在如下代码中:


class MyClass:

    pass


if __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,但是我添加了两个额外的属性,因此我猜该对象应该变得“更大”。好吧,结果似乎并非如此。


繁华开满天机
浏览 258回答 2
2回答

眼眸繁星

基本上,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 sysIn [17]: sys.getsizeof(a1.__dict__)Out[17]: 140In [18]: sys.getsizeof(a2.__dict__)Out[18]: 140In [19]: sys.getsizeof(a1.__dict__.keys())Out[19]: 40In [20]: sys.getsizeof(a2.__dict__.keys())Out[20]: 48In [21]: sys.getsizeof(a2.__dict__.keys()+a2.__dict__.values())Out[21]: 60In [22]: sys.getsizeof(a1.__dict__.keys()+a2.__dict__.values())Out[22]: 52希望这可以为您解释一些事情。
随时随地看视频慕课网APP

相关分类

Python
我要回答