为什么列表的大小不等于其元素的总和' Python中的大小?

时间:2018-02-19 16:38:44

标签: python list byte

问题:在Python程序中,列表的大小(以字节为单位)小于其所有元素的大小。 这是我要测试的代码。我使用 sys.getsizeof()将变量的大小作为字节。

import sys
l = range(10)
for i in range(0,10):
    print(sys.getsizeof(l[i]))
    i = i + 1
#and it returns 12 bytes for  each element
print(sys.getsizeof(l))
#and it returns 76 , not 120

是什么原因?

1 个答案:

答案 0 :(得分:1)

根据sys.getsizeof的{​​{3}}:

  

“只考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗。”

这意味着每个元素的存储需求不会是数据结构(list)所需字节数的一部分。因此,您必须添加列表的大小和各个元素,以获得存储结构所需的总内存。

但是内存仍会(通常)随着列表的增加而增加。这是因为list需要内存来保存对元素的引用。但是,由于底层实现,列表可以请求或保持比保持其引用实际需要的更多内存。这通常在列表上执行pop操作时出现。这通常不会减少list的内存占用(您的里程可能会有所不同):

>>> import sys
>>> l = [0,1,2]
>>> sys.getsizeof(l)
88
>>> l.pop()
2
>>> l
[0, 1]
>>> sys.getsizeof(l)
88
>>> l.append(2)
>>> l
[0, 1, 2]
>>> sys.getsizeof(l)
88
>>> l.append(3)
>>> l
[0, 1, 2, 3]
>>> sys.getsizeof(l)
120
>>> l.pop()
3
>>> l
[0, 1, 2]
>>> sys.getsizeof(l)
120

因此,通常在添加新元素时,list内存占用量将增加,但一旦弹出元素,它就不会再次减少。但是,一旦元素弹出,列表中将有一个“备用”位置可以重新用于新元素(引用),这允许列表增加其长度而不增加它的记忆足迹。