sys.getsizeof(list)返回的内容少于其元素的总和

时间:2015-05-05 08:05:44

标签: python list

我很好奇 - 为什么sys.getsizeof调用返回的列表数小于其元素总和?

import sys
lst = ["abcde", "fghij", "klmno", "pqrst", "uvwxy"]
print("Element sizes:", [sys.getsizeof(el) for el in lst])
print("Sum of sizes: ", sum([sys.getsizeof(el) for el in lst]))
print("Size of list: ", sys.getsizeof(lst))

以上打印

Element sizes: [42, 42, 42, 42, 42]
Sum of sizes:  210
Size of list:  112

怎么回事?

2 个答案:

答案 0 :(得分:4)

您将获得实际列表对象的大小。由于列表对象存储指向对象的指针,因此其内存大小必然与其元素的总和不同(且更低)。

通过类比,它就像在C中获取指针数组的大小。

答案 1 :(得分:1)

可以通过a获得numpy数组a.nbytes的内存。

sys.getsizeof显示“仅直接归因于对象[...]的内存消耗,而不是它所引用的对象的内存消耗”。 (根据文档)。就您而言,它不能保存所有数据。可以用a.flags看到,它输出:

C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False

对于第一个数组,它是:

C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False

OWNDATA字段为False解释了为什么sys.getsizeof仅输出128个字节。