截至2014年6月,应该考虑使用哪些工具来提高Python代码性能?

我用
Python编写了一个小型的科学实验,现在我需要考虑优化这段代码.在分析之后,我应该考虑哪些工具来提高性能.根据我的理解,以下内容不起作用:

Psyco:过时了(不支持Python 2.7)

Pyrex:最后更新是在2010年

Pypy:NumPy存在问题

除了编写C模块然后以某种方式将它们与Python接口(例如,使用Cython)之外,现在还有哪些选项?

最佳答案 您可以使用Cython将瓶颈编译为C.这对于具有紧密循环的数字代码非常有效. Python循环会增加很多开销,如果您可以将事物转换为纯C,则不存在.通常,您可以为任何静态类型的代码获得非常好的性能(也就是说,您的类型不会更改,并且您可以在源上注释它们).

您还可以在C中编写算法的核心部分(或者使用已经编写的库)并将其包装起来.您仍然可以使用Cython或SWIG编写大量样板代码,但现在有一些像XDress这样的工具可以为您完成.如果您是FORTRAN人,那么f2py就是您的工具.

现代CPU有许多内核,因此您应该能够在Python的多处理中利用它. joblib的工作人员为它提供了一个非常好的简化界面.

当您可以使用PyCUDA时,一些问题也适用于GPU计算.

Theano是一个图书馆,是Numpy,Cython,Sympy和PyCUDA之间的桥梁.它可以评估和编译表达式并生成GPU内核.

最后,有Numba和Blaze的未来. Numba是一个基于LLVM的JIT编译器.开发并不完整,因为缺少一些语法并且bug很常见.我不相信它已经为生产代码做好了准备,除非您确信您的代码库得到了完全支持并且您拥有非常好的测试覆盖率. Blaze是下一代Numpy,支持核心存储和更灵活的阵列;并设计使用Numba作为后端来加速执行.它处于发展的早期阶段.

关于你的选择:

> Pysco:作者认为该项目已经完成,他决定与Pypy合作.它的大部分功能都在那里.
>派热克斯:废弃的项目,Cython从中分叉.它具有所有功能和更多功能.
> Pypy:不是普通科学代码的真正选择,因为与C的接口太慢而且不完整. Numpy只是部分支持,Scipy将永远没有希望(主要是因为FORTRAN依赖).这可能会在未来发生变化,但可能不会很快.无法完全使用C扩展限制了使用外部代码的可能性.
我必须添加我已成功使用它与Networkx(纯Python网络库),因此有一些用例可以使用它.

点赞