让 Python 代码运行更快的最佳方式!

栏目: Python · 发布时间: 6年前

内容简介:PyPy 是 Python 解释器的替代品,对于某些 Python 程序来说会快很多倍。

让  <a href='https://www.codercto.com/topics/20097.html'>Python</a>  代码运行更快的最佳方式!

PyPy 是 Python 解释器的替代品,对于某些 Python 程序来说会快很多倍。

让 Python 代码运行更快的最佳方式!

作者 | Serdar Yegulalp

译者 | 姜松浩,责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

Python因其强大、灵活且易于使用等特性,而赢得了声誉。这些优点使其在各种各样的应用程序、工作流程和领域中得到了广泛应用。但是就语言的设计,也就是它天然的解释能力还有它的运行时的动态性而言,Python总是比C或C ++这样的机器本地语言慢一个数量级。

多年来,开发人员已经为Python的速度限制提出了各种变通方法。例如你可以在C中编写性能密集型任务并使用Python封装它,许多机器学习库正是这样做的。或者你可以使用Cython,这个项目可以将Python种加上运行时类型信息以便编译为C,通过这种方式来允许你使用Python代码。

但变通办法从来都不是理想的。如果我们能够按原样使用现有的Python程序并以更快的速度运行它,那不是很好吗?这正是PyPy允许你做的事情。

让 Python 代码运行更快的最佳方式!

PyPy与CPython

PyPy是Python解释器CPython的直接替代品。CPython将Python编译为中间字节码然后由虚拟机解释,而PyPy使用实时(JIT)编译将Python代码转换为本地机器的汇编语言。

根据正在执行的任务,性能提升可能会非常显着。平均而言,PyPy将Python加速了大约7.6倍,一些任务加速了50倍或更多。CPython解释器根本不会执行与PyPy一样的优化方式,并且可能永远不会,因为这不是它的设计目标之一。

最好的部分是开发人员需要很少甚至不需要努力来解锁PyPy提供的收益。只需将CPython替换为PyPy,并且大部分都已完成。下面讨论了一些例外,但是PyPy的目标是运行现有的,并且未经修改的Python代码并为其提供自动化的速度提升。

PyPy目前通过项目的不同版本支持Python 2和Python 3。换句话说,你需要下载不同版本的PyPy,具体取决于你运行的Python版本。 PyPy的Python 2分支已经存在了很长时间,但到目前为止,python 3版本的速度已经提高了很多。PyPy目前支持Python 3.5(发布版本)和Python 3.6(beta版本)。

除了支持所有核心Python语言外,PyPy还可以与Python生态系统中的绝大多数 工具 配合使用,例如用于打包的pip或用于虚拟环境的virtualenv。大多数Python软件包,即使是那些带有C模块的软件包,都会按照原样运行。当然,也存在一些限制,我们将在下面介绍一些限制。

让 Python 代码运行更快的最佳方式!

PyPy如何工作

PyPy使用其他即时编译器中的动态语言优化技术。它分析运行的Python程序,以确定在程序中创建和使用对象时的类型信息,然后使用该类型信息作为指导来加快速度。例如,如果Python函数仅使用一种或两种不同的对象类型,PyPy会生成机器代码来处理这些特定情况。

PyPy的优化是在运行时自动处理,因此你通常不需要调整其性能。高级用户可能会尝试使用PyPy的命令行选项来为特殊情况生成更快的代码,但这种情况通常很少需要。

PyPy也脱离了CPython处理一些内部函数的方式,但它同时试图保留兼容的行为。例如PyPy处理垃圾回收的方式与CPython不同。并非所有对象一旦超出范围就立即回收,所以在PyPy下运行的Python程序可能比在CPython下运行时显示占用更大的内存。但你仍然可以使用通过gc模块公开的Python高级垃圾回收控件,例如gc.enable(),gc.disable()和gc.collect()等等。

如果你想在运行时获得有关PyPy的JIT(实时)行为的信息,PyPy包含一个模块pypyjit,它向你的Python应用程序公开了许多JIT关联信息。如果你的某个功能或模块在JIT上表现不佳,那么pypyjit可以让你获得有关它的详细统计信息。

另一个特定于PyPy的模块,__pypy__暴露了PyPy特有的其他功能,因此对于编写利用这些功能的应用程序非常有用。由于Python的运行的动态性,有可能构建在PyPy存在时使用这些功能的Python应用程序,而在不存在时忽略它们。

让 Python 代码运行更快的最佳方式!

PyPy的限制

可能看PyPy起来像魔法一样神奇,但其实它并不神奇。 PyPy同样具有某些限制,可以削弱或消除某些程序的有效性。唉,PyPy不是CPython运行时的完全的通用替代品。

PyPy最适合纯Python的应用程序

PyPy在“纯”Python应用程序中表现最佳,换句话说也就是用Python编写的没有夹杂其他语言的应用程序中表现最佳。由于PyPy模仿CPython的本机二进制接口的方式,与C库(如NumPy)接口的Python包也没有那么出类拔萃了。

PyPy的开发人员已经解决了这个问题,并使PyPy与大多数依赖于C扩展的Python包更加兼容。例如Numpy现在与PyPy兼容的非常好。但是,如果你希望与C的扩展最大程度地兼容,请使用CPython。

PyPy适用于运行时间较长的程序

PyPy优化Python程序的一个副作用是,运行时间较长的程序通过PyPy的优化获益最多。程序运行的时间越长,PyPy可以收集的运行时类型信息就越多,它可以进行的优化就越多。一劳永逸的Python脚本不会从这种事情中受益。例如受益的Python应用程序通常具有长时间循环运行的行为,或者在Web框架的后台中连续运行。

PyPy没有预编译

PyPy编译Python代码,但它不是Python代码的编译器。由于PyPy执行其优化的方式和Python的固有动态特点,因此无法将生成的JITted代码作为独立二进制文件发出并重新使用它。每次运行都必须编译每个程序。如果你想将Python编译成可以作为独立应用程序运行的更快的代码,那么还是请使用Cython、Numba或当前实验性的Nuitka项目。

原文:https://www.infoworld.com/article/3385127/what-is-pypy-faster-python-without-pain.html

本文为 CSDN 翻译,转载请注明来源出处。

【END】

让 Python 代码运行更快的最佳方式!

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员: 极客宝宝(ID: geek_baby)

戳他了解更多↓↓↓

让 Python 代码运行更快的最佳方式!

 热 文推 荐 

☞ 华为海思芯片 10 年备胎史!

☞ 微信手机 WeOS 的可行性到底有多大?

☞ 原生 CSS “杀死” 预处理器 Sass!

☞别怀疑,孩子在家里也能学编程!

☞为什么你写了一万小时的代码,却没能成为架构师?| 程序员有话说

☞ARM到底是一家什么样的公司?

☞百花村区块链山的选民们, 超有趣!

☞危机加剧:ARM釜底抽“芯”,华为腹背受敌

☞大神!这段代码让 程序员 躺赚200W,源码简单,你怎么看?

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Analytics 2.0

Web Analytics 2.0

Avinash Kaushik / Sybex / 2009-10-26 / USD 39.99

The bestselling book Web Analytics: An Hour A Day was the first book in the analytics space to move beyond clickstream analysis. Web Analytics 2.0 will significantly evolve the approaches from the fir......一起来看看 《Web Analytics 2.0》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试