2017-07-18 60 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)来增量构建达到你的最终结果。