Python itertools.combinations() 内存问题

2 投票
1 回答
2043 浏览
提问于 2025-04-17 06:58

我正在处理大量的物品组合(来自《英雄联盟》),大约有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

撰写回答