我在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
答案 0 :(得分:3)
list
个对象旨在动态增长(通过append
,extend
或列表理解构建)。每次添加元素时执行 realloc (可能还有memmove
)都不符合要求。所以有一个“增长”算法试图预测需要多少元素(当然这只是一个统计猜测)。
这就是为什么实际分配的内存可能大于项目数。
tuple
个对象是不可变的。 Python没有理由预先分配更多的元素。
关于列表增长算法的一些参考:
答案 1 :(得分:2)
来自Are tuples more efficient than lists in Python?的Raymond Hettinger和tzot,
基本上,元组可以比列表更快地访问,因为元组是不可变的,因此它可以更有效地存储。
与元组相矛盾的列表是从头开始构建的。
如果你想迭代一个常量序列,那么元组就更好了,因为他们计算了python代码编译成字节码的时候。
答案 2 :(得分:0)
内存中元组对象的大小小于列表。但这在使用大型物体时才会引人注意。这就是使元组操作更快的原因。