8

通过编写遗传编程类型的应用程序,我在学习 Python 中获得了很多乐趣。

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

该程序有4个主要功能:

  • 生成(随机)一个表达式树。
  • 评估树的适应度
  • 杂交
  • 变异

正如所有生成、杂交和变异一样,都称为“评估适应度”。它是最繁忙的功能,也是速度方面的主要瓶颈。

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

“适应度函数”需要将表达式树的值与目标表达式的值进行比较。所以它将由一个后缀评估器组成,它将按后缀顺序读取树。我有python中的所有代码。

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

谢谢你。

4

4 回答 4

14

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

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

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

如果你正在做大量的数字和数组处理,你应该看看 pandas、Numpy/Scipy、gmpy 第三方模块;它们是用于处理数组/表格数据的优化 C 库。

您想尝试的另一件事是 PyPy。PyPy 可以 JIT 重新编译并进行比 CPython 更高级的优化,并且无需更改 Python 代码即可工作。尽管针对 CPython 的优化良好的代码看起来与针对 PyPy 的优化良好的代码完全不同。

接下来要尝试的是 Cython。Cython 是一种与 Python 略有不同的语言,实际上 Cython 实际上最好被描述为具有类型化 Python 语法的 C。

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

于 2010-04-15T18:47:53.553 回答
3

Cython 是最快完成工作的,可以直接在 Cython 中编写算法,也可以用 C 编写算法并使用 Cython 将其绑定到 python。

我的建议:学习 Cython。

于 2010-04-15T16:42:46.853 回答
0

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

但是,在这些可能性中,由于您已经编写了 python 代码,因此首先尝试 cython 可能是一件好事。也许您不必重写任何代码即可获得加速。

于 2010-04-15T16:36:22.647 回答
0

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

于 2010-04-15T23:57:28.823 回答