Python itertools.combinations() 内存问题
我正在处理大量的物品组合(来自《英雄联盟》),大约有7200万种组合,这些组合都被输入到一个函数中,用来计算它们的好处。
我们的目标是找到最佳的组合。
虽然可能有更好的算法来解决这个问题,但我想知道为什么我会遇到内存错误?
allpossiblei = itertools.combinations(items.keys(),5)
maxc = 0
i = 0
for combo in allpossiblei:
icombo = [items[name] for name in combo]
res, tcost = calcStats(icombo, 0.658,100,100)
if res > maxc :
maxc = res
print str(res) + " " + str(res/tcost)
print combo
print float(i)/79208745.0
if i % 500000 == 0:
print str(float(i)/79208745.0) + "\n \n"
gc.collect()
i = i + 1
calcStats这个函数除了用局部变量进行一些简单的数学运算外,什么也不做。
但它很快就消耗掉超过2GB的内存,并且大约在5分钟后就停止了。我以为itertools可以提供一个不会消耗大量内存的生成器?我甚至加了gc.collect()这个语句,但似乎没有效果。有没有什么建议?
1 个回答
0
组合函数会把提供的整个迭代器都用掉,形成一个组合池。没有其他办法可以避免这一点。你可以在文档中查看这个函数的伪代码:http://docs.python.org/library/itertools.html#itertools.combinations