2012-09-23 40 views
0

我在写一个python脚本,它可以做各种各样的字符排列。最终,脚本会因内存不足而崩溃,具体取决于我想要进行排列的深度。python,遍历非常大的数字时内存不足

我最初以为解决方案将清空列表并重新启动,但这样做,我得到索引超出界限错误。

这是我目前的设置:

for j in range(0, csetlen): 
    getJ = None 
    for i in range(0, char_set_len): 
     getJ = word_list[j] + char_set[i] 
     word_list.append(getJ) 

    csetlen = csetlen - j 
    del word_list[j-1:] 
    word_list.append(getJ) 
    j=0 

基本上,csetlen可以是一个非常大的数字(过量100,000,000)。当然,我没有足够的内存,所以我试图找出如何缩小外部for循环中的列表。如何优雅地做这件事?

内存错误与word_list有关。目前,我正在存储数百万种不同的排列;我需要能够“回收”一些旧的列表值。如何做到这一点的Python列表?

回答

1

你想要的是按需生成的值(并且不将它们存储在内存中)的迭代:

from itertools import product 
getJ_iterator = product(wordlist[:csetlen], char_set[:char_set_len]) 

这等同于以下生成功能:

def getJ_gen(first_list, second_list): 
    for i in first_list: 
     for j in second_list: 
      yield (i, j) 

getJ_iterator = getJ_gen(wordlist[:csetlen], char_set[:char_set_len]) 

您可以像这样遍历对象:

for item in getJ_iterator: 
    #do stuff 

请注意在这种情况下,210将是一个形式为(word, char)的元组。

+0

@icktoofay:Doh!是的,我做到了。 :P –