Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用cython或PyPy优化元组/列表(用python实现的图论算法)_Python_List_Tuples_Cython_Pypy - Fatal编程技术网

使用cython或PyPy优化元组/列表(用python实现的图论算法)

使用cython或PyPy优化元组/列表(用python实现的图论算法),python,list,tuples,cython,pypy,Python,List,Tuples,Cython,Pypy,我正在研究一个理论图论问题,涉及到在超图中使用超边的组合来分析各种情况 我已经用Python实现了主算法的初始版本,但由于其组合结构(可能还有我的实现),该算法相当慢 我考虑加速的一种方法是使用PyPy或Cython 看看文档,Cython在元组方面似乎没有提供很好的加速。这对于实现来说可能是有问题的,因为我将超边表示为元组-因此大多数算法都是在操作元组(但是它们都是相同的长度,每个长度大约为len 6) 由于我的C语言和Python技能都很低,如果有人能建议,鉴于代码依赖元组/列表,优化代码的

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

我已经用Python实现了主算法的初始版本,但由于其组合结构(可能还有我的实现),该算法相当慢

我考虑加速的一种方法是使用PyPy或Cython

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

由于我的C语言和Python技能都很低,如果有人能建议,鉴于代码依赖元组/列表,优化代码的最佳方式是什么,我将不胜感激。是否有将列表/元组与Cython(或PyPy)一起使用的文档

优化代码的最佳方式是什么

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


此外,对于图形,您可以尝试使用优秀的模块。此外,如果处理长排序列表,您可以查看和模块。

如果您的算法在计算复杂性方面不好,则无法保存,您需要编写更好的算法。查阅一本好的图论书籍或维基百科,这通常是相对容易的,尽管有一些具有非平凡和难以实现的算法。这听起来像是PyPy可以显著加速的事情,但只能通过一个常量因子来加速,但是它不涉及对代码的任何修改。Cython在没有类型声明的情况下并不能提高代码的速度,而且似乎仅仅通过类型并不能真正提高这类问题的速度


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

你能发布你的代码并突出显示慢的部分吗?在没有看到代码的情况下很难提出改进建议,因为问题可能不是您所认为的那样。一般来说,提高速度的最好办法是想出一个更好的算法……Cython可以使用C数组和结构,并允许您定义扩展类型。其中任何一个都可能是元组的替代品。@Roland,该算法实际上是NP(它与超图中的匹配有关),因此我不希望有比我已经实现的算法更优化的算法。然而,我只对一个非常具体的案例感兴趣。根据我在Python中的幼稚实现的运行时间,我估计,如果我能让它运行快100倍,那么它将在可接受的时间内(大约2周)完成。谢谢Janne,关于如何通过cython将c数组包含到Python代码中,你有什么例子或指针吗?@nsimplex:你能展示代码吗,那么我们可以建议改进吗?有一些标准的技巧可以帮助你,比如用理解代替循环,用空间换取时间……谢谢Jakub。探查器很有用,我以前运行过它,通过使用它,我估计我需要使函数加快100倍,以使代码在可接受的时间内完成。我也看过你提到的图论软件包,它们确实非常优秀。但是,我没有使用它们,因为在图论算法方面,我只需要在超图中进行匹配,并且我必须以特定的方式实现它,以便能够使用一些快捷方式。谢谢fjal。事实上,我所需要的是100倍的加速。我的问题与您提出的关于数据类型的问题有关。如何在C中声明python元组以获得最大的加速比。请举例说明如何做到这一点。你把事情弄糊涂了。很多用PyPy就行了。PyPy不像Cython——你不需要定义任何东西,它应该可以工作。