1

我正在研究一个理论图论问题,该问题涉及在超图中采用超边的组合来分析各种情况。

我已经在 Python 中实现了主要算法的初始版本,但是由于它的组合结构(可能还有我的实现),该算法非常慢。

我正在考虑加快速度的一种方法是使用 PyPy 或 Cython。

查看文档,似乎 Cython 在元组方面并没有提供很大的加速。这对于实现来说可能是有问题的,因为我将超边表示为元组 - 所以算法的大部分是在处理元组(但是它们的长度都是相同的,每个大约 len 6)。

由于我的 C 和 Python 技能都非常低,如果有人能建议在优化代码时使用元组/列表的最佳方法,我将不胜感激。是否有使用 Cython(或 PyPy)的列表/元组的文档?

4

2 回答 2

1

如果你的算法在计算复杂度方面不好,那你就救不了了,你需要把它写得更好。查阅一本好的图论书或维基百科,它通常相对容易,尽管有些算法既不平凡又难以实现。这听起来像是 PyPy 可以显着加速的事情,但只是通过一个常数因子,但是它不涉及对代码的任何修改。如果没有类型声明,Cython 并不会加速你的代码,而且似乎这类问题不能仅仅通过类型来加速。

常数部分在这里至关重要 - 如果算法复杂度增长到 2^n (这对于简单算法来说是典型的),那么在图中添加额外的节点会使您的时间加倍。这意味着 10 个节点加 1024 个时间,20 个节点 1024*1024 等等。如果你非常幸运,PyPy 可以将你的算法加速 100 倍,但这在图形大小上保持不变(你很快就会用完宇宙时间以一种或另一种方式)。

于 2013-04-02T08:51:32.833 回答
0

继续优化代码的最佳方法是什么...

先介绍一下。有一个标准的cProfile模块可以很好地进行简单的分析。在分析之前优化代码是毫无意义的。

此外,对于图表,您可以尝试使用出色的networkx模块。此外,如果您处理长排序列表,您可以查看bisectheapq模块。

于 2013-03-31T16:54:17.317 回答