【问题标题】:What are the memory requirements for large python list?大型 python 列表的内存要求是什么?
【发布时间】:2010-12-31 10:54:40
【问题描述】:

我做了一件愚蠢的事,比如:

from itertools import *
rows = combinations(range(0, 1140), 17)
all_rows = []
for row in rows:
    all_rows.append(row)

毫不奇怪;我用完了内存地址空间(32 位 python 3.1) 我的问题是:如何计算大型列表需要多少内存地址空间?在这种情况下,列表的顺序为2.3X10^37。 Python中是否有一个函数可以返回我正在寻找的信息,或者实际上是一个较小但相似的列表的大小?这些工具是什么?

【问题讨论】:

  • 不就是1140选17吗?
  • 10^37?真的吗?这大约是 125 位的寻址空间来简单地计算元素。您必须从基本面重新考虑这一点。存储在这里并不是真正的问题。除了详尽地枚举所有组合之外,您还需要做一些事情。
  • 顺便说一下,试试 all_rows = list(combinations(range(0, 1140), 17)) - 应该会减少内存使用量。
  • 顺便说一句。 64 位只能数到 10^19。
  • Vincent 的问题清楚地表明他知道这是“愚蠢的”,他真正感兴趣的是如何计算内存消耗,特别是有哪些工具可用。这是一个完全有效、陈述清楚的问题。

标签: python memory-management 32bit-64bit


【解决方案1】:

有一个方便的函数 sys.getsizeof()(从 Python 2.6 开始)可以帮助解决这个问题:

>>> import sys
>>> sys.getsizeof(1)  # integer
12
>>> sys.getsizeof([]) # empty list
36
>>> sys.getsizeof(()) # empty tuple
28
>>> sys.getsizeof((1,))  # tuple with one element
32

从中可以看出每个整数占用 12 个字节,列表或元组中每个引用的内存是 4 个字节(在 32 位机器上)加上开销(分别为 36 或 28 个字节)。

如果您的结果包含长度为 17 的整数元组,那么您将拥有 17*(12+4)+28 或每个元组 300 个字节。结果本身是一个列表,因此 36 个字节加上每个引用 4 个字节。找出列表的长度(称为 N),并且您有 36+N*(4+300) 作为所需的总字节数。

编辑:还有另一件事可能会显着影响该结果。 Python 根据需要为大多数整数值创建新的整数对象,但对于小的整数对象(在 Windows 上的 Python 2.6.4 上根据经验确定为范围 [-5, 256]),它会预先创建它们并重新使用它们。如果您的大部分值小于 257,这将显着减少内存消耗。 (在 Python 上 257 is not 257+0 ;-))。

【讨论】:

  • 还要注意 Slide Inc 的一个新开源包:github.com/slideinc/meminfo,它是“用于查找精确内存中 python 对象大小的 C 扩展”。
  • 请注意,PyPy 不支持sys.getsizeof()
【解决方案2】:

先好了,而不是写:

all_rows = []
for row in rows:
    all_rows.append(row)

你可以简单地写:

all_rows = list(rows)

这样会更有效率。

那么,列表的内存消耗需要考虑两件事:

  • 构成列表的对象的内存消耗;这显然取决于这些对象、它们的类型以及是否有很多共享
  • 列表本身的内存消耗;列表中的每个对象都由一个指针引用,该指针在 32 位模式下占 4 个字节,在 64 位模式下占 8 个字节;因此,粗略地说,列表本身的大小是(4 或 8 个字节)乘以列表中的对象数量(这忽略了固定的列表头开销和 Python 列表所做的适度过度分配)

顺便说一句,在最近的 Python 版本中,您可以使用sys.getsizeof() 来获取对象的大小:

>>> import sys
>>> sys.getsizeof([None] * 100)
872

【讨论】:

    【解决方案3】:

    附录:由于您正在处理整数列表并担心内存使用 --- 还有array-module:

    [array] 定义了一个对象类型,它可以紧凑地表示一个基本值数组:字符、整数、浮点数。数组是序列类型,其行为与列表非常相似,只是其中存储的对象类型受到限制。类型在对象创建时指定 [...]。

    【讨论】:

      【解决方案4】:

      你要求

      http://en.wikipedia.org/wiki/Binomial_coefficient

      http://www.brpreiss.com/books/opus7/programs/pgm14_10.txt

      无论如何,听起来你正试图通过蛮力解决一个 NP 完全问题;)

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2019-08-09
      相关资源
      最近更新 更多