【问题标题】:Does the list object as argument value of an array object occupy memory in Python?列表对象作为数组对象的参数值是否占用 Python 中的内存?
【发布时间】:2019-10-31 01:47:05
【问题描述】:

array.array 对象的内存占用比 Python 中的 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 使用了要构建的列表。如何使用数组更节省内存?

【问题讨论】:

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

标签: python arrays list memory


【解决方案1】:

sys.getsizeof 不是递归的。所以它会告诉你,列表占用了多少内存。但不是列表的内容。试试这个:

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

输出172

array.array 确实使用了更少的内存,它也更密集,所以它对缓存更友好。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多