问题:在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
是什么原因?
答案 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
内存占用量将增加,但一旦弹出元素,它就不会再次减少。但是,一旦元素被弹出,列表中将有一个“备用”位置可以重新用于新元素(引用),这允许列表增加其长度而不增加它的记忆足迹。