【问题标题】:using cython or PyPy to optimise tuples/lists (graph theory algorithm implemented in python)使用 cython 或 PyPy 优化元组/列表(用 python 实现的图论算法)
【发布时间】:2013-03-31 15:51:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能发布你的代码并突出显示速度慢的部分吗?不看代码就很难提出改进建议,因为问题可能不是你想的那样。 一般而言,提高速度的最佳答案是考虑更好的算法...
  • Cython 可以使用 C 数组和结构,并允许您定义扩展类型。其中任何一个都可以替代元组。
  • @Roland,算法实际上是NP(它与超图中的匹配有关),所以我不能指望比我已经实现的算法更优化。但是,我只对一个非常具体的案例感兴趣。我根据我在 Python 中幼稚实现的运行时间估计,如果我可以让它运行速度快 100 倍,那么它会在可接受的时间内完成(大约 2 周)。
  • 谢谢 Janne,你有任何关于如何通过 cython 将 c 数组包含到 python 代码中的示例或指针(请原谅双关语!)?
  • @nsimplex:您能展示一下代码吗,我们可以提出改进建议吗?有一些标准技巧可以提供帮助,例如用推导替换循环,以及用空间换时间......

标签: python list tuples cython pypy


【解决方案1】:

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

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

【讨论】:

  • 谢谢 fjal。事实上,我需要的只是 100 倍的加速。我的问题与您提出的有关数据类型的问题有关。如何在 C 中声明 python 元组以获得最大的加速。非常感谢您提供有关如何执行此操作的示例。
  • 你把事情搞糊涂了。很多。只需使用 PyPy。 PyPy 不像 Cython - 你不必定义任何东西,它应该可以工作。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢雅库布。探查器很有用,我之前运行过它,通过使用它,我估计我需要使函数快 100 倍,以使代码在可接受的时间内完成,以达到我的目的。我也确实看过你提到的图论包,它们确实很棒。但是,我没有使用它们,因为就图论算法而言,我只需要在超图中进行匹配,并且我必须以特定的方式实现它,以便能够使用一些快捷方式。
猜你喜欢
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2018-06-16
相关资源
最近更新 更多