python 优化加速方案

来源:互联网 发布:单片机烧不进程序 编辑:程序博客网 时间:2024/06/05 11:27

也看了知乎上关于python加速方案,有好多方案,但是感觉没全记住,这里把自己需要总结的记下来,

原文:https://www.zhihu.com/question/24695645?sort=created

优化 Python 性能:PyPy、Numba 与 Cython,谁才是目前最优秀的 Python 运算解决方案?

就算是使用了numpy等包,再做了大量的代码优化工作,python的运算速度仍然没法令人满意。这样看来,python要摆脱“开发快、运行慢”这种身份还得依靠Cython、Numba和Pypy,还有llvmpy、pyston、PyCUDA等等编译阶段的优化工具。那么从多快省(通用性、速度、易用性)多角度出发,这些解决方案中谁才是最优秀的?


说说容易做并行化的。

开源解决方案里,支持自动并行化的,有numexpr/theano,能把基于numpy的表达式编译成能在多核/gpu上跑的形式,之前大作业有用到,效果不错,推荐题主试试。

对于复杂一些的情形,不是几个numpy表达式能搞掂的计算,你可以手动拆分计算,写一个worker函数,然后用multiprocessing库或者IPython Parallel来把worker函数分派到本地/远程机器上的多个核心搞计算。multiprocessing库属于标准库,在py3k里还有一个标准库concurrent.futures,相当于一个wrapper,用里面的ProcessPoolExecutor十分方便。对了,multiprocessing库不怎么鲁棒,有一系列坑,包括不能在repl下用/不能处理类的成员函数等。按照文档里最简单的写法来就没问题了。

Numba可以pass掉。它还有一个商业版NumbaPro,能够自动做多核/GPU优化。反过来说,社区版的Numba短期内也只能编译到LLVM,不能自动并行化。看题主关心的应该是科学计算,不能并行化的解决方案没什么意思。

Cython可以pass掉,手动写并行,不如直接换C++,用那边的并行库。

pypy可以pass掉,这货拿来做web后端倒挺适合,拿来做科学计算就免了,numpy支持一堆坑。尤其是再做各种第三方numpy优化就更不行了,毕竟它的c api跟CPython都不一样。