Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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中是否占用内存?_Python_Arrays_List_Memory - Fatal编程技术网

列表对象作为数组对象的参数值在Python中是否占用内存?

列表对象作为数组对象的参数值在Python中是否占用内存?,python,arrays,list,memory,Python,Arrays,List,Memory,在Python中,array.array对象的内存占用比list对象小。创建array.array时是否仍具有内存效率,如下图所示 from array import array array('l', [1, 2, 3, 4, 5]) 我们仍然在那里创建一个列表对象(作为参数值)来创建该数组。这难道不意味着数组不值得使用吗 更新:看起来我应该重新考虑数组比列表占用更少空间的说法。在不同的Python版本中,它们的行为似乎有所不同: Python 3.5.2 >>> impo

在Python中,
array.array
对象的内存占用比
list
对象小。创建
array.array
时是否仍具有内存效率,如下图所示

from array import array
array('l', [1, 2, 3, 4, 5])
我们仍然在那里创建一个列表对象(作为参数值)来创建该数组。这难道不意味着数组不值得使用吗

更新:看起来我应该重新考虑数组比列表占用更少空间的说法。在不同的Python版本中,它们的行为似乎有所不同:

Python 3.5.2 
>>> import array, sys
>>> mylist = [1, 2, 3]
>>> myarray = array.array('i', [1, 2, 3])
>>> sys.getsizeof(mylist)
44
>>> sys.getsizeof(myarray)
44

Python 3.6.3 
>>> import array, sys
>>> mylist = [1, 2, 3]
>>> myarray = array.array('i', [1, 2, 3])
>>> sys.getsizeof(mylist)
88
>>> sys.getsizeof(myarray)
76

但是,我最初的问题仍然存在(对于Python 3.6)
myarray
使用了要构造的列表。使用数组如何提高内存效率?

通过使用
array.array
可以存储相邻的类C原语值,而不是对象。如果数组太大以至于初始值设定项列表的大小让您担心,请使用迭代器作为初始值设定项。这将在数组初始化期间将内存使用减少到单个元素。

sys.getsizeof
不是递归的。所以它显示了列表在内存中的占用量。但不是列表的内容。试试这个:

mylist = [ 5000, 5001, 5002 ]
sys.getsizeof(mylist) + sum(sys.getsizeof(q) for q in mylist)
输出
172

array.array
无疑使用更少的内存,它的包密度也更高,因此它对缓存更友好


在您的示例中,列表还用于创建
array.array
,然后立即销毁。因此,这里没有什么大问题。

虽然python.org没有明确提到内存,但它认为它们是高效的:但我在许多其他帖子上读到,数组占用的内存比列表少。与数组相比,一旦集合包含大量条目,列表的内存开销就会减少。例如:每个集合12345个整数,通过使用数组而不是列表,您可以节省惊人的0.016%内存。。。这样我就不会担心了;>@Exho当您检查需要执行的列表大小时,
sys.getsizeof([1,2,3,4,5])
而不是
sys.getsizeof(['l',[1,2,3,4,5]])
用于创建数组的列表可以在之后立即进行垃圾收集,因此它的内存使用只是暂时的。而
sys.getsizeof()
在这里测量的是两种不同的东西——对于数组,它是整个对象;对于列表,它只是引用的列表,不包括单个元素的大小。创建了一个列表对象,但由于它是匿名的,一旦
array
完成它,它就有资格进行垃圾收集。