问题:在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
原因是什么?
根据 sys.getsizeof
的文档:
"只有直接归因于对象的内存消耗是指它所指对象的内存消耗。"
这意味着每个元素的存储需求将不属于数据结构(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
内存足迹将增加,但是一旦弹出该元素,它就不会再次减少。但是,一旦弹出元素,列表中将有一个"备用"位置,可以重复使用新元素(参考(,这允许列表增加其长度而不会增加它的内存足迹。