我用Python编写了一个小型科学实验,现在我需要考虑优化这段代码。在分析之后,我应该考虑哪些工具来提高性能。根据我的理解,以下不会起作用:
Psyco :过时(不支持Python 2.7)
Pyrex:上次更新是在2010年
Pypy:与NumPy存在问题
除了编写C模块然后以某种方式将它们与Python连接(例如,使用 Cython )之外,还有哪些选项?
答案 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作为后端来加速执行。它处于发展的初期阶段。
关于您的选择:
答案 1 :(得分:2)