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

时间:2014-06-16 02:53:22

标签: python numpy

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

Psyco :过时(不支持Python 2.7)

Pyrex:上次更新是在2010年

Pypy:与NumPy存在问题

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

Numba是Python代码的JIT编译器(与NumPy一起使用)。看起来相当容易,非常有效。

编辑:有一个很好的例子,使用Numba来加速有限差分2D拉普拉斯方程here