将大号存储在列表中会更好吗?

时间:2014-12-18 20:16:30

标签: python

在列表中存储大号是否有内存效率?为什么会发生以下情况?

>>> 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的大小相等?

3 个答案:

答案 0 :(得分:31)

sys.getsizeof()返回大小,即列表对象本身的大小,而不是它包含的对象的大小。

来自documentation

  

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

如果您想计算大小,可能值得尝试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()返回列表对象的大小,而不是其内容!