我需要加速一个函数。我应该用cython、ctypes还是其他什么?

2024-09-30 16:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我从托尔斯滕·马雷克、保罗·汉金和亚历克斯·马尔泰利那里得到了一些很好的建议。在

该程序有4个主要功能:

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

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

正如遗传算法的本质一样,它必须搜索一个巨大的解空间,这样越快越好。我想加速这些功能。我先从健身评估师开始。我的问题是什么是最好的方法。我一直在研究cython、ctypes和“链接和嵌入”。它们对我来说都是新的,目前我还远远超出了我的能力,但我期待着学习其中的一个,并最终将它们全部学完。在

“fitness function”需要将表达式树的值与目标表达式的值进行比较。因此它将包含一个后缀求值器,它将按后缀顺序读取树。我有所有的python代码。在

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

谢谢。在


Tags: 程序功能应用程序类型表达式链接编程ctypes
3条回答

暂时不要理会别人的回答。首先你应该学会使用分析器。Python附带了一个profile/cProfile;您应该学习如何读取结果并分析真正的瓶颈所在。优化的目标有三个方面:减少每次调用所花费的时间,减少要进行的调用的数量,以及减少内存使用以减少磁盘抖动。在

第一个目标相对容易。分析器将向您显示最耗时的函数,您可以直接转到该函数进行优化。在

第二个和第三个目标更难实现,因为这意味着您需要更改算法来减少打这么多电话的需要。找出调用次数较多的函数,并设法减少调用次数。利用内置的集合,它们非常优化。在

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

你还想试试PyPy。PyPy可以JIT重新编译,并比CPython做更高级的优化,而且不需要更改python代码。尽管针对CPython的优化代码看起来与针对pypyy的优化代码有很大不同。在

下一个尝试是赛顿。实际上,Python的语法与Cython的描述略有不同。在

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

另一个很棒的选项是Booo::Python,它可以让你轻松地包装C或C++。在

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

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

我的建议是:学习赛顿。在

相关问题 更多 >