python sizeof list vs sizeof tuple

时间:2017-02-08 08:49:18

标签: python sizeof internals

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

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

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

我理解list和tuple之间的区别,但我希望它们的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
  • 我们如何解释这个?
  • 我在哪里可以找到python内部的好文档?

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

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

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

与元组相矛盾的列表是从头开始构建的。

如果你想迭代一个常量序列,那么元组就更好了,因为他们计算了python代码编译成字节码的时候。

答案 2 :(得分:0)

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