python sizeof 列表与 sizeof 元组

python sizeof list vs sizeof tuple

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

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

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

我理解列表和元组之间的区别,但我希望它们的 sizeof (size of object in memory) 是相同的:都带有方法并且都包含相同的值。

此外,尺码差异取决于商品长度:

>>> 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

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

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

tuple 对象是不可变的。 Python 没有理由 pre-allocate 更多元素。

列表增长算法的一些参考:

根据来自 Are tuples more efficient than lists in Python? 的 Raymond Hettinger 和 tzot 的说法,

基本上,元组可以比列表更快地访问,因为它的存储效率更高,因为元组是不可变的。

列表,与元组相反,是从头开始构建的。

如果您想遍历常量序列,元组更好,因为它们在 python 代码编译为字节码时进行了计算。

元组对象在内存中的大小小于列表。但这只有在使用大对象时才会注意到。这就是使元组操作更快的原因。