防止 itertools.permutation 中的内存错误

Posted

技术标签:

【中文标题】防止 itertools.permutation 中的内存错误【英文标题】:Prevent memory error in itertools.permutation 【发布时间】:2011-06-28 08:01:55 【问题描述】:

首先我想提一下我有一个 3 GB 的内存。

我正在研究一种算法,它在节点上的时间是指数的,所以我在代码中拥有它

perm = list( itertools.permutations(list(graph.Nodes))) # graph.Nodes is a tuple of 1 , 2 , ... n integers

它生成列表中所有顶点的组合,然后我可以处理其中一个排列。

但是,当我为 40 个顶点运行程序时,它会出现内存错误。

在实现中有没有更简单的方法可以生成顶点的所有组合并且不会出现此错误。

【问题讨论】:

作为侧边栏,内存错误的原因是这样的:wolframalpha.com/input/?i=40%21+bytes+in+gigabyte perm 将包含 815915283247897734345611269596115894272000000000 (40!) 40 个项目的列表。 你知道有多少顶点组合吗?你打算如何处理所有的组合?您可以避免一次全部存储它们,但如果您真的需要考虑每种组合,则无法保证在您完成时宇宙存在......切换到 C 也无济于事。 真正的算法是什么——你想做什么? “指数”时间通常表示 O(2^N);在这里,我们有 O(N!),这要糟糕得多。 是的,所以我正在处理一些订购问题,到目前为止还没有其他解决方案:) ...无论如何,非常感谢 【参考方案1】:

尝试使用由排列生成的迭代器,而不是用它重新创建一个列表:

perm_iterator = itertools.permutations(list(graph.Nodes))

for item in perm_iterator:
   do_the_stuff(item)

通过这样做,python 将只保留当前使用的排列,而不是所有排列(就内存使用而言,它确实更好;))

另一方面,一旦内存问题解决,处理所有排列的时间将随着顶点数量呈指数增长......

【讨论】:

【参考方案2】:

这行不通。循环遍历迭代器也不起作用。你看,如果 for 循环中的代码需要 1 微秒来运行,那么完全运行需要 2.587×10^34 年。 (见http://www.wolframalpha.com/input/?i=40%21+microseconds+in+years)

【讨论】:

以上是关于防止 itertools.permutation 中的内存错误的主要内容,如果未能解决你的问题,请参考以下文章

如何防止用户重复提交数据

PHP 怎么防止GET方式提交重复数据?

如何防止网站被*** 防止网站数据被***篡改

MyBatis怎么防止SQL注入

如何彻底防止SQL注入?

怎么防止网站被***和防止服务器被黑