2010-04-15 61 views
6

通过编写一个遗传编程类型的应用程序,我有很多乐趣学习Python。我需要加快功能。我应该使用cython,ctypes还是其他?

我从Torsten Marek,Paul Hankin和Alex Martelli在这个网站上得到了一些很好的建议。

该方案有4个主要功能:

  • 生成(随机)的表达式树。
  • 评估树的健身
  • 杂交
  • 发生变异

由于所有产生,杂交和变异称之为“评估健身”。这是最繁忙的功能,并且是速度上的主要瓶颈。

由于遗传算法的本质,它必须搜索巨大的解决方案空间,所以越快越好。我想加快这些功能。我将从健身评估员开始。我的问题是做这件事的最好方法是什么。我一直在研究cython,ctypes和'链接和嵌入'。他们对我来说都是新手,现在已经超出了我的视野,但我期望学习一门,最终全部学习。

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

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

谢谢。

回答

11

现在忽略所有人的答案。你应该学会使用的第一件事是分析器。 Python带有profile/cProfile;您应该学习如何阅读结果并分析真正的瓶颈所在。优化的目标有三个方面:减少每次通话花费的时间,减少要拨打的电话数量,减少内存使用量以减少磁盘抖动。

第一个目标是比较容易的。分析器将向您显示最耗时的功能,您可以直接找到该功能来优化它。

第二个和第三个目标比较难,因为这意味着您需要更改算法以减少进行这么多调用的需要。查找具有大量呼叫的功能,并尝试找到方法来减少调用它们的需要。利用内置的集合,它们非常优化。

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

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

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

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

+3

当您使用python的配置文件或cProfile时,我发现真正方便且有用的一件事是让我看到图示的数字。我最喜欢的是RunSnakeRun。它需要wxPython和其他一些依赖项。在你的cProfile输出上运行它会产生一个GUI squaremap-thingy,其中每个函数都被绘制成一个矩形,其大小为该函数内的(平均或累积)时间,并为它所调用的函数封装了rects。让理解的分析器输出变得轻而易举。 – 2010-11-22 23:39:56

0

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

尽管有这些可能性,但由于您已经编写了python代码,因此先尝试使用cython可能是件好事。也许你不需要重写任何代码来获得加速。

+0

是的,我听说过它。这意味着我必须学习足够多的c来编写它的功能,这可能是一个好主意。 – 2010-04-15 16:41:12

3

Cython是通过直接在Cython中编写算法,或者通过将其写入C并使用Cython绑定到python来完成任务的最快方法。

我的建议:学习Cython。

+0

cython对我最有吸引力,但会是最快的吗? – 2010-04-15 16:55:46

0

尝试工作你的健身功能,以便它支持记忆。这将使用快速词典查找来替换与以前通话重复的所有通话。

相关问题