4

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

4

1 回答 1

7

基本上,python 的类和实例都是对象。当您测试 的大小时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

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

于 2013-06-13T15:40:22.887 回答