itertools 产品使用太多内存

itertools product uses too much memory

我只有两个句子想要生成变体并计算其列维斯坦距离,但是当尝试使用 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

问题不在于 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:

来限制数量
<b>from itertools import islice, product</b>

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

因此我们将产品数量限制为 1'000'000。