我在 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
对象被设计为动态增长(通过 append
、extend
或列表理解构建)。每次添加元素时都执行 realloc(可能还有 memmove
),性能不佳。所以有一个“增长”算法试图预测将需要多少元素(当然这只是一个统计猜测)。
这就是为什么实际分配的内存可以大于项目数的原因。
tuple
对象是不可变的。 Python 没有理由预先分配更多元素。
关于列表增长算法的一些引用资料:
关于python sizeof 列表与 sizeof 元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42108466/