我很好奇 - 为什么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
怎么回事?
答案 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个字节。