itertools产品使用太多内存

时间:2017-08-02 22:50:43

标签: python itertools cartesian-product

我只有两个句子,我想产生变化并计算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

1 个答案:

答案 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。