还能更快!让 Python 变快的 5个方案

Python 的运行速度确实没有 C 或者 Java 快,但是有一些项目正在努力让 Python 变得更快。

Python 代码简洁干净,但是大家都知道 Python 运行起来相对较慢。在 CPU 密集型的任务上慢于 C、Java 和 Javascript,但是有些团队希望 Python 是尽善尽美的,所以他们准备从内而外地提升 Python 的性能。

如果你想让 Python 在特定硬件上运行得快一点,你至少有两个选择,每个选择都有一些弊病:

  • 你可以创建一个 Python 运行时的替代品,但是最后你会发现你重写了一遍 CPython。

  • 你可以重写现存的部分代码来利用一些性能优化的特性,缺点是程序员需要做更多的工作。

 

下面是五种已有的方案,帮助你提高 Python 的性能。

 

一、PyPy

在 CPython 的替代品中,PyPy 是最显眼的那一个(比如 Quora 就在生产环境中使用它)。它也最有机会成为默认解释器,它和现存 Python 代码高度兼容。

 

PyPy 使用适时编译来加速 Python,这项技术 Google 也在使用,Google 在 V8 引擎中使用它加速 Javascript。最近的版本 PyPy2.5 增加了一些提升性能的特性,其中有一项很受欢迎,它集成了 Numpy,Numpy 之前也一直被用来加速 Python 的运行。

使用 Python3 的代码需要对应地使用 PyPy3。PyPy 目前只支持到 Python3.2.5,对 Python3.3 的支持正在进行中。

 

二、Python

Pyston,由 Dropbox 资助,使用 LLVM 编译器架构来加速 Python,同样的它也使用了适时编译。相比于 PyPy,Pyston 还处于早期阶段,它只支持 Python 的部分特性。Pyston 把工作分成两个部分,一部分是语言的核心特性,另一部分是把性能提升到可接受的程度。Pyston 距离可以在生产环境使用还有一段距离。

 

三、Nuitka

除了替换 Python 运行时,有些团队尝试将 Python 代码转换为能够在本地高效运行的其他语言的代码。其中著名的项目是 Nuitka-- 把 Python 代码转换为 C++ 代码 -- 虽然运行时还是依赖 Python 运行时。这样限制了它的可移植性,不过性能提升是可观的。长期规划中,Nuitka 还准备让 C 语言能够调用 Nuitka 编译的 Python 代码,这样性能提升将更加明显。

 

四、Cython

Cython(Python 的 C 语言扩展)是 Python 的超集,它能把 Python 代码编译成 C 代码,并与 C 和 C++ 进行交互。它可以作为 Python 项目的扩展使用(重新性能要求高的部分),或者单独使用,不涉及传统的 Python 代码。缺点是你写的不是 Python,所以需要手动迁移,缺乏可移植性。

据说,Cython 提供了一些特性来让代码更高效,比如变量类型化,这本质上是 C 要求的。一些科学计算的包,如 scikit-learn 依赖 Cython 的一些特性来保持操作简洁快速。

 

五、Numba

Numba 结合了上面几个项目的想法。学习了 Cython,Numba 也采用了部分加速的策略,只加速 CPU 密集型的任务;同时它又学习了 PyPy 和 Pyston,通过 LLVM 运行 Python。你可以用一个装饰器指定你要用 Numba 编译的函数, Numba 继承 Numpy 来加速函数的执行,Numba 不做适时编译,它的代码是预先编译的。


Python 之父说:大部分觉得 Python 慢的应用都是没有正确地使用 Python。对于 CPU 密集型的任务有多种方法来提升性能--使用 Numpy 来做计算,调用外部 C 代码,以及尽量避免 GIL 锁。由于 GIL 锁目前还无法被替代,所以有很多项目开始尝试一些短期可行的替代方案,当然这些方案也可能转变为长期的可选项。

 

posted on 2021-03-02 13:17  阿陶学长  阅读(881)  评论(0编辑  收藏  举报