在列表中存储大号是否有内存效率?为什么会发生以下情况?
>>> A = 100**100
>>> sys.getsizeof(A)
102
>>> B = [100**100]
>>> sys.getsizeof(B)
40
为什么A和B的大小不相等?
>>> C = [1,100**100]
>>> sys.getsizeof(C)
44
>>> D = [1000**1000, 100**100]
>>> sys.getsizeof(D)
44
为什么C和D的大小相等?
答案 0 :(得分:31)
sys.getsizeof()
返回浅大小,即列表对象本身的大小,而不是它包含的对象的大小。
只考虑直接归因于对象的内存消耗,而不是它所引用的对象的内存消耗。
如果您想计算深大小,可能值得尝试Pympler:
>>> from pympler.asizeof import asizeof
>>> A = 100**100
>>> asizeof(A)
120
>>> B = [100**100]
>>> asizeof(B)
200
因此,在我的计算机上,将long放在列表中会增加80字节的开销。
答案 1 :(得分:9)
A和B的大小不相等,因为您已将B放入列表中。在这种情况下,A是长,B是列表类型。 C和D的大小相同,因为它们的数字内容在列表容器中的宽度相同。
此外,sys.getsizeof()
returns the size of the topmost object使用__sizeof__
方法,而不是该对象内部引用的项目的大小。
答案 2 :(得分:4)
来自python wiki:
因为它
getsizeof()
以字节为单位返回对象的大小。对象可以是任何类型的对象。所有内置对象都将返回正确的结果,但这不一定适用于第三方扩展,因为它是特定于实现的。
只考虑直接归因于对象的内存消耗,而不是它所引用的对象的内存消耗。
在这种情况下,B是列表的名称,实际上是列表的指针!所以getsizeof()
返回列表对象的大小,而不是其内容!