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



问题:在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内存足迹将增加,但是一旦弹出该元素,它就不会再次减少。但是,一旦弹出元素,列表中将有一个"备用"位置,可以重复使用新元素(参考(,这允许列表增加其长度而不会增加它的内存足迹。

最新更新