Python sys.getsizeof(list)返回的值小于其元素之和
我很好奇-为什么调用返回的列表数字比它的元素总和要小Python sys.getsizeof(list)返回的值小于其元素之和,python,list,Python,List,我很好奇-为什么调用返回的列表数字比它的元素总和要小 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
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
为什么会这样?您得到的是实际列表对象的大小。当列表对象存储指向对象的指针时,它的内存大小必然与其元素之和不同(且更低) 打个比方,这就像在C中获得指针数组的大小。根据,
sys.getsizeof
执行以下操作:
返回对象的大小(以字节为单位)。对象可以是任何类型的对象
对象所有内置对象都将返回正确的结果,但是
对于第三方扩展,它不一定是真的
具体实施
只有直接归因于该对象的内存消耗才会被忽略
已计算,而不是它所指对象的内存消耗
因此,只有内置对象中非常原始的类型才能真正得到准确的结果。即使对于内置容器类型,通常也需要使用某种递归函数来查找容器的“总”大小(列表、字典等)。但是,请记住,python列表实际上只是一个可重新调整大小的指针数组,因此在某种意义上,它是一个精确的数字
但是,您正在寻找以下内容:
此外,请注意:
>>> sys.getsizeof(npArrayList[0])
96
>>>
每一个numpy对象——或者任何相关对象——都有一些开销,当您将np.array
指定为列表元素时,您将创建一个新对象,因此实际上,以下内容只考虑数组内容的内存,而不考虑整个对象的开销:
>>> npArrayList[0].nbytes
32
numpy数组
a
的内存可以通过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字节。列表包含指针。这里的指针指向4个元素数组,但每个数组与主数组(视图)共享数据