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

标签 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。

最佳答案

只有在 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/

相关文章:

python - Python 2 使用什么方法打印元组?

python - 将用户名和密码存储到字典中?

python - Keras - RTX 2080 ti 训练比仅 CPU 和 GTX 1070 慢?

python - 为什么 Python CONTINUE LOOP 允许外循环,而 BREAK LOOP 不允许?

python - 数据框合并+与存在性测试比较

python - OSx 更新后如何修复损坏的 python 2.7.11

python - Python 编译器如何使用声明的编码预处理源文件?

python - 连续的 DDPG 似乎没有收敛于一个二维空间搜索问题 ("Hunt the Thimble")

python - 设置当线程以其他方式完成时要执行的行为

rest - Tornado 可以处理分页吗?