快亦有道!让 Python 变快的 5个方案

  • A+
所属分类:安全开发

阅读本文大概需要 5 分钟。



快亦有道!让 Python 变快的 5个方案
译者:诗书塞外
原文:http://dwz.date/duAA

Python 的运行速度确实没有 C 或者 Java 快,但是有一些项目正在努力让 Python 变得更快。
Python 代码简洁干净,但是大家都知道 Python 运行起来相对较慢 --- 在 CPU 密集型的任务上慢于 C、Java 和 Javascript(但是大多数服务都不是 CPU 密集型的)--- 但是有些团队希望 Python 是尽善尽美的,所以他们准备从内而外地提升 Python 的性能。
如果你想让 Python 在特定硬件上运行得快一点,你至少有两个选择,每个选择都有一些弊病:
  1. 你可以创建一个 Python 运行时的替代品,但是最后你会发现你重写了一遍 CPython。

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

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

1. PyPy

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

快亦有道!让 Python 变快的 5个方案

PyPy 使用适时编译来加速 Python,这项技术 Google 也在使用,Google 在 V8 引擎中使用它加速 Javascript。最近的版本 PyPy2.5 增加了一些提升性能的特性,其中有一项很受欢迎,它集成了 Numpy,Numpy 之前也一直被用来加速 Python 的运行。
使用 Python3 的代码需要对应地使用 PyPy3。PyPy 目前只支持到 Python3.2.5,对 Python3.3 的支持正在进行中。

2. Pyston

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

快亦有道!让 Python 变快的 5个方案

3. Nuitka

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

快亦有道!让 Python 变快的 5个方案

4. Cython

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

快亦有道!让 Python 变快的 5个方案

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

5. Numba

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

快亦有道!让 Python 变快的 5个方案

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



- EOF -


推荐阅读  点击标题可跳转
别人家的年终奖
马斯克的星际飞船又炸了!回收时发动机重启失败,「横」着砸向地面
5 个无聊透顶的 Python 程序
我用 Python 集齐了支付宝五福!
得本文对你有帮助?请分享给更多人

本文始发于微信公众号(进击的Coder):快亦有道!让 Python 变快的 5个方案

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: