我正在尝试在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
在该示例中,我只是存储了str
和int
值,但它们可以是 Python 中的任何对象。最好的部分是,此字典不会根据最大索引(像list
那样(消耗内存,而是基于其中存储的值数量。