截至2014年6月,人们应该考虑什么工具来提高Python代码的性能? 我在Python写了一个小的科学实验,现在我需要考虑优化这个代码。在分析之后,为了提高性能,我应该考虑什么样的工具。根据我的理解,以下方法行不通:

截至2014年6月,人们应该考虑什么工具来提高Python代码的性能? 我在Python写了一个小的科学实验,现在我需要考虑优化这个代码。在分析之后,为了提高性能,我应该考虑什么样的工具。根据我的理解,以下方法行不通:,python,numpy,Python,Numpy,Psyco:过时(不支持Python 2.7) Pyrex:上次更新是在2010年 Pypy:与NumPy有问题 除了编写C模块,然后以某种方式将它们与Python连接(例如,通过使用Cython)之外,现在还有哪些选项?是Python代码的JIT编译器(它与NumPy一起工作)。看起来很简单,也很有效 编辑:有一个很好的例子,使用Numba加速有限差分2D Laplace eq您可以使用Cython将瓶颈编译为C。这对于具有紧密循环的数字代码非常有效。Python循环会增加相当多的开销,如果您

Psyco:过时(不支持Python 2.7)

Pyrex:上次更新是在2010年

Pypy:与NumPy有问题

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

是Python代码的JIT编译器(它与NumPy一起工作)。看起来很简单,也很有效


编辑:有一个很好的例子,使用Numba加速有限差分2D Laplace eq

您可以使用Cython将瓶颈编译为C。这对于具有紧密循环的数字代码非常有效。Python循环会增加相当多的开销,如果您可以将内容转换为纯C,这是不存在的。一般来说,对于任何静态类型的代码,您都可以获得非常好的性能(也就是说,您的类型不会更改,您可以在源代码上对它们进行注释)

您还可以用C编写算法的核心部分(或者使用已经编写好的库)并对其进行包装。您仍然可以使用Cython或SWIG编写大量样板代码,但现在有了像XDress这样的工具可以为您完成这项工作。如果您是FORTRAN人员,那么f2py就是您的工具

现代CPU有许多核心,因此您应该能够在Python的多处理中利用它。joblib的家伙们为它提供了一个非常漂亮和简化的界面

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

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

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

关于您的选择:

  • Pysco:作者认为项目已经完成,他决定与Pypy合作。它的大部分功能现在都在那里
  • Pyrex:废弃的项目,Cython就是从那里分叉的。它有它的所有特点,还有更多
  • Pypy:对于一般科学代码来说不是一个真正的选择,因为与C的接口太慢,而且不完整。Numpy只得到了部分支持,Scipy的希望渺茫(主要是因为FORTRAN依赖性)。这在将来可能会改变,但可能不会很快改变。不能完全使用C扩展在很大程度上限制了使用外部代码的可能性。 我必须补充一点,我已经在Networkx(纯Python网络库)中成功地使用了它,所以在一些用例中它可能会有用

据我所知,
Pypy
被认为是目前提高速度的最佳选择。如果它在
NumPy
方面有问题,我会寻找避免问题的方法。请注意,NumPy到pypy有一个端口-,但要达到这个端口…第一个任务是确定代码的哪些部分比较慢。如果您已经在使用Numpy,并且Numpy部分是瓶颈,那么在性能方面,您可能处于或接近行的末尾。在计划使用替代口译员之前,请先进行分析。算法的改变可能是第一位的。@AShelly肯定,但我想知道在算法的改变完成后人们能做些什么。Numba很酷,但有点不稳定。Python的某些部分还不受支持,还有一些是有缺陷的。非常感谢您提供了这一信息丰富的答案!你能写一点解释这一部分吗:>你可以用Cython把瓶颈编译成C。这对于循环很紧的数字代码非常有效。一般来说,任何静态类型的代码都可以获得很好的性能。@user89我已经这样做了。现在清楚了吗?有点——我想知道我是否理解正确:Cython可以直接将(带注释的)Python脚本编译成C?@user89。当您提供足够的信息(所有类型,Cython都知道所有功能)时,是的。如果不这样做,它将退回到Python层,并带来性能代价。很酷的一点是,您可以从Python代码开始,以增量方式将其构建到C中,直到速度足够快,但不必牺牲任何Python功能。与pyCUDA相比,numba在2016年有什么更新吗?我很震惊,我很难在两者之间找到一个比较。两者都支持GPU编程,看起来是最新的文档,所以我不知道哪一个是最好的。