我只有两个句子,我想产生变化并计算leveshtein距离,但是当试图用itertools产生这个列表时,即使我的64GB RAM机器也会过载。
有没有办法限制这一点,即使我必须将其限制为一定数量的组合。
到目前为止,这是我的代码:
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
答案 0 :(得分:2)
问题不在于itertools
:itertools懒惰地工作:它产生迭代。问题是您首先要将所有这些元素放在一个列表中。结果,所有组合必须同时存在。这显然需要比迭代方式更多的内存,因为在后一种情况下,可以重复使用先前组合的内存。
如果你想打印所有组合,而不存储,你可以使用:
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。