为什么原始类型的子类在Python中占用更多的内存?

时间:2019-01-31 16:19:18

标签: python python-2.7 python-internals

我正在尝试像这样(简化版本)在Python中继承基元类型:

class MyInt(int):
    pass

我认为此类的对象将占用与原始对象相同的内存量。但是,显然这是不正确的:

import sys
sys.getsizeof(10)          # 24
sys.getsizeof(MyInt(10))   # 72

使用__slots__,我可以节省一些内存,但是子类仍然需要更多空间:

class MyInt(int):
    __slots__ = ()


sys.getsizeof(10)          # 24
sys.getsizeof(MyInt(10))   # 56

另一方面,如果我子类化自己的类,则内存使用情况是相同的:

class Father(object):
    pass


class Son(Father):
    pass

sys.getsizeof(Father())  # 64
sys.getsizeof(Son())     # 64
  1. 如果没有多余的字段,为什么子类型对象比原始类型对象使用更多的内存?
  2. 有没有办法防止(或最小化)这种情况?

我正在使用Python 2.7.12。

1 个答案:

答案 0 :(得分:0)

仅当在Python 2.2中创建“新样式类”时,才可以在Python中对内置类进行子类化。因此,无需查看代码,也无需仔细阅读此Guido's article上的演示文稿注释,就有可能推断出Python2需要一些样板内部字段来允许内置类(它们的代码库是先前编写的。统一)),并且在子类化时可以像“用户定义的类”一样良好地工作。 (这是“对象”行为,不是“旧式”“ int”对象的代码库内置的)。

无论发生什么事,都位于Python's 2.7 Objects/typeobject.c内-因此您可以在那儿看看(或等到可以更轻松地分析得出另一个答案的人后再来)

就像@blownhither_ma在上面的评论中提到的那样,Python3中似乎不再是这种情况-我要说类统一自2009年以来已经得到巩固:

In [158]: from sys import getsizeof as sizeof

In [159]: sizeof(int())
Out[159]: 24

In [160]: class MInt(int):
     ...:     __slots__ = ()
     ...:     

In [161]: sizeof(MInt())
Out[161]: 24

因此,尽管您的问题尚待解决,但它们仅对Python 2有意义,而现在还没有人可以在新代码中使用它。