2017-07-18 85 views
1

我使用itertools的排列來製作一個可能的句子組合列表的列表,但它似乎甚至在我的64GB機器上爆炸的內存很快。在內存管理方面,我不是最好的,所以我想了解如何讓我的代碼更好。如果我能計算出幾千個這樣的塊的列表,那就太好了。現在我只能真正買得起10從itertools爆炸內存使用排列

import itertools 
from os import sys 

arq_in = sys.argv[1] 
f1 = open(arq_in, 'r') 

list_items = [] 
items = [] 

lines = f1.readlines() 
for line in lines: 
    line =line.strip() 
    list_items.append(line) 

for L in range(0, len(list_items)+1): 
    for subset in itertools.permutations(list_items, L): 
     items.append(subset) 

output = "\n".join(" ".join(map(str,l)) for l in items) 
print output 

這裏是我輸入:

ah k l ih r ih ng hh w ae r 
ah s eh k ih n d t w ih ch t 
ah s iy k r ih t w ah r l d 
ah s l iy p ih ng k ae p s l 
ah v ay t ah m ah n ae n d 
d aw n ih n b ih k ah r ih ng 
d ey t ah p oy n t s ih n 
ey jh ih n s iy hh ay ah r d ah 
f ih ng g ah r hh ae d ah 
ih g z ih s t ih n w ao r m 
ih k s p r eh sh ih n ih n dh ah 
ih n d ah l jh ih n ae n 
ih n m ay ey jh ih n s iy 
ih n v eh s t ih n b l ae k 
ih z m eh zh ah r d ih n 
m ae ch ih ng y aa r n ih n 
r iy d ih ng ih n p uh r 
s ah ch ah d ih z ae s t ah r 
s ih s t ah m ae n d ae d 
th r eh d m ae ch ih ng y aa r n 
+4

如果你只需要幾千個,你有足夠的時候打破你的循環。排列的數量將變得非常快。對於你在這裏的輸入數量,它會輕易超過你的記憶。另外,您的輸入包含重複項,所以您將多次創建相同的排列。那是你要的嗎? – BrenBarn

回答

1

以下列方式運行它將確保您不會耗盡內存,因爲我們正在使用延遲評估(意思是說,只有在需要時纔會計算下一次迭代)。

這種方法具有保持在內存中的整個事情的優勢,所以儘管它仍然會在很長一段時間運行,直到它完成(它運行在我的機器上一個小時,仍然沒有完成),但它不會崩潰!

import itertools 
from os import sys 

def lazy_iter(lines): 
    list_items = [] 
    for line in lines: 
     line =line.strip() 
     list_items.append(line) 

    for L in range(0, len(list_items)+1): 
     for subset in itertools.permutations(list_items, L): 
      yield subset 


if __name__ == "__main__": 
    arq_in = sys.argv[1] 
    f1 = open(arq_in, 'r') 
    lines = f1.readlines()  
    for l in lazy_iter(lines): 
     print map(str,l) 

假設你真的不想要print任何此類l一個字符串,可以限制迭代只爲要生成的項目數運行無論你需要什麼,都可以和他們一起做。

1

由於@BrenBarn指出,對於即使相對較小列出了許多排列。事實上,對於您選擇i項目的n個項目的列表,有n! /((i!)(i-1)!)排列。但是,如果您負擔得起處理時間(爲了完全處理列表,您必須負擔得起),而不是一次處理全部置換集合,您可以使用generator(如itertools)來增量構建達到你的最終結果。