python sizeof 列表与 sizeof 元组

标签 python sizeof internals

我在 python 中注意到以下事实:

>>> (1, 2, 3).__sizeof__()
48

>>> [1, 2, 3].__sizeof__()
64

我理解列表和元组之间的区别,但我希望它们的 sizeof (内存中对象的大小) 是相同的:都带有方法并且都包含相同的值。

此外,尺寸差异取决于元素的长度:

>>> for size in (10, 100, 1000, 10000):
        tuple_ = tuple(range(size))
        list_ = list(range(size))
        print list_.__sizeof__(), tuple_.__sizeof__()     
176   104
984   824
9088  8024
90088 80024
  • 我们如何解释这一点?
  • 我在哪里可以找到有关 python 内部结构的好文档?

最佳答案

list 对象被设计为动态增长(通过 appendextend 或列表理解构建)。每次添加元素时都执行 realloc(可能还有 memmove),性能不佳。所以有一个“增长”算法试图预测将需要多少元素(当然这只是一个统计猜测)。

这就是为什么实际分配的内存可以大于项目数的原因。

tuple 对象是不可变的。 Python 没有理由预先分配更多元素。

关于列表增长算法的一些引用资料:

关于python sizeof 列表与 sizeof 元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42108466/

相关文章:

python - 如何强制 2 个 Python 子进程一个接一个地运行

来自两个列表或 zip 的 python 理解

python - Django:管理界面中多对多项目的名称

c++ - Sizeof() 函数不适用于常量数组 C++

c - 我是 c 编程初学者,需要 sizeof() 字符串常量方面的帮助吗?

c - 重新分配后结构的无效大小

python - _pickle.PicklingError : Could not serialize object: TypeError: can't pickle _thread. RLock 对象

python - 绑定(bind)调用中发生了什么? (Python+套接字+strace)

c - 如何检查 GCC GENERIC 中的声明是否为 'extern'?