我正在尝试在python中预分配列表
c=[1]*mM #preallocate array
我的问题是我从
开始遇到MemoryErrormM=4999999950000000
解决这个问题的最佳方法是什么?我正在考虑创建一个新对象,将我的列表拆分为大约500000000
的值。
这是我应该做的,还是有最好的做法来创建一个包含大量输入的数组?
答案 0 :(得分:4)
您正在尝试创建一个极有可能无法放入计算机内存的对象。如果您确实需要表示该长度的列表,则可以使用生成器根据需要动态生成值。
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
会),而是基于存储在其中的值的数量。