我正在尝试像这样子类化 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
- 如果没有额外的字段,为什么子类型对象比基本类型对象使用更多的内存?
- 有办法防止(或尽量减少)这种情况吗?
我使用的是 Python 2.7.12。
最佳答案
只有在 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 重要,现在没有人应该在新代码中使用它。
关于python - 为什么 Python 中原始类型的子类占用更多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54464878/