在 Python 中预分配非常大的数组会导致 MemoryError



我正在尝试在python中预分配一个列表

c=[1]*mM #preallocate array

我的问题是我遇到了内存错误,因为

mM=4999999950000000

处理这个问题的最佳方法是什么。我正在考虑创建一个新对象,其中将我的列表拆分为大约500000000的值。 这是我应该做的,还是有最佳实践来创建具有大量输入的数组?

使用生成器

您正在尝试创建一个很可能无法放入计算机内存中的对象。如果您确实需要表示该长度的列表,则可以使用根据需要动态生成值的生成器。

def ones_generator(length):
for _ in range(length):
yield 1
gen = ones_generator(4999999950000000)
for i in gen:
print(i)  # prints 1, a lot

注意:该问题标记为 Python 3,但如果您使用的是 Python 2.7,则需要使用xrange而不是range

使用字典

从您的问题听起来,您实际上不需要预先分配该长度的列表,但您希望在非常大的索引中非常稀疏地存储值。这种模式与 Python 中的dict类型比list更匹配。您可以简单地将值存储在字典中,而无需预先分配它们的键/空格,Python 会为您处理。

dct = {}
dct[100000] = "A string"
dct[592091] = 123
dct[4999999950000000] = "I promise, I need to be at this index"
print(dct[4999999950000000])
# I promise, I need to be at this index

在该示例中,我只是存储了strint值,但它们可以是 Python 中的任何对象。最好的部分是,此字典不会根据最大索引(像list那样(消耗内存,而是基于其中存储的值数量。

相关内容

最新更新