Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sys.getsizeof(list)返回的值小于其元素之和_Python_List - Fatal编程技术网

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个元素数组,但每个数组与主数组(视图)共享数据