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