我需要加快功能。我应该使用cython,ctypes还是其他什么?

时间:2010-04-15 16:23:09

标签: python ctypes cython

通过编写基因编程类型的应用程序,我学习Python非常有趣。

我在本网站上收到了Torsten Marek,Paul Hankin和Alex Martelli的一些很好的建议。

该计划有4个主要功能:

  • 生成(随机)表达式树。
  • 评估树的适应性
  • 杂交
  • 突变

所有生成,杂交和变异调用'评估适应性'。它是最繁忙的功能,是速度上的主要瓶颈。

正如遗传算法的本质一样,它必须搜索一个巨大的解决方案空间,因此越快越好。我想加快这些功能。我将从健身评估员开始。我的问题是最好的方法是什么。我一直在研究cython,ctypes和'链接和嵌入'。他们对我来说都是新手,现在已经超出了我的范围,但我期待着学习一个,最终学习所有这些。

'适应度函数'需要将表达式树的值与目标表达式的值进行比较。因此它将包含一个后缀评估器,它将以后缀顺序读取树。我在python中有所有代码。

我需要建议我现在应该学习和使用:cython,ctypes或链接和嵌入。

谢谢。

4 个答案:

答案 0 :(得分:13)

暂时忽略所有人的回答。您应该学习使用的第一件事是分析器。 Python附带一个profile / cProfile;您应该学习如何阅读结果并分析真正的瓶颈所在。优化的目标有三个:减少每次调用所花费的时间,减少调用次数,减少内存使用以减少磁盘抖动。

第一个目标相对容易。分析器将向您显示最耗时的功能,您可以直接使用该功能进行优化。

第二个和第三个目标更难,因为这意味着您需要更改算法以减少拨打这么多电话的需要。找到具有大量调用的函数,并尝试找到减少调用它们的方法。利用内置的集合,它们得到了很好的优化。

如果你已经完成了上述所有操作并且仍然存在性能问题并且你在x86平台上(基本上是大多数CPU),那么就开始关注Psyco。 Psyco可以根据需要更改你的python代码来优化Python代码。

如果你正在进行大量的数字和数组处理,你应该看看Numpy / Scipy和gmpy第三方模块。

接下来尝试的是Cython。 Cython与Python略有不同,实际上Cython实际上是C语言的C语言。

对于非常紧凑的循环中的代码部分,您无法再使用任何其他方式进行优化,您可能希望将其重写为C扩展。 Python对使用C语言进行扩展有很好的支持。

答案 1 :(得分:3)

通过直接在Cython中编写算法,或者用C语言编写并使用Cython将其绑定到python,Cython是最快完成工作的。

我的建议:学习Cython。

答案 2 :(得分:0)

另一个很好的选择是boost :: python,它可以让你轻松地包装C或C ++。

在这些可能性中,既然你已经编写了python代码,那么cython可能是首先尝试的好东西。也许你不必重写任何代码来获得加速。

答案 3 :(得分:0)

尝试使用您的健身功能,以便它支持记忆。这将使用快速字典查找替换所有与先前调用重复的调用。