2017-08-02 47 views
1

我只有两个句子,我想产生变化和计算leveshtein距离,但是当试图用itertools产生这个列表时,即使我的64GB RAM机器过载。itertools产品使用太多的内存

有没有办法限制这一点,即使我必须将其限制在一定数量的组合中。

这里是到目前为止我的代码:

from __future__ import print_function 
import itertools 
import sys 

in_file = sys.argv[1] 
X = [] 


with open(in_file) as f: 
     lis = list(f) 
X.append([' '.join(x) for x in itertools.product(*map(set, zip(*map(str.split, lis))))]) 

for x in X: 
     print x 
+1

Itertools没有使用那么多的内存。事实上,你将它转换为列表。 'itertools'懒惰地工作。 –

回答

2

的问题不在于itertools:itertools工作懒洋洋地:它产生iterables。问题是你首先想把所有这些元素放在一个列表中。因此,所有组合必须同时存在。这显然需要比迭代的方式更多的内存,因为在后一种情况下,前一个组合的内存可以重用。

如果你这样想打印的所有组合,不会存入,你可以使用:

with open(in_file) as f: 
     lis = list(f) 
for x in itertools.product(*map(set, zip(*map(str.split, lis)))): 
    print(' '.join(x)) 

如果你想保存它们,你可以限制数量通过itertools.islice

from itertools import islice, product 

X = [] 
with open(in_file) as f: 
     lis = list(f) 
X += [' '.join(x) for x in islice(product(*map(set, zip(*map(str.split, lis)))),1000000)])

这里我们将产品数量限制在1'000'000。