加入收藏 | 设为首页 |

寓言故事的成语-让 Python 代码运转更快的最佳方法!你会了吗?

海外新闻 时间: 浏览:182 次

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



Python因其强壮、灵敏且易于运用等特性,而赢得了名誉。这些长处使其在各式各样的应用程序、作业流程和领域中得到了广泛应用。可是就言语的规划,也便是它天然的解说才能还有它的运转时的动态性而言,Python总是比C或C ++这样的机器本地言语慢一个数量级。

多年来,开发人员现已为Python的速度约束提出了各种变通方法。例如你能够在C中编写功用密集型使命并运用Python封装它,许多机器学习库正是这样做的。或许你能够运用Cython,这个项目能够将Python种加上运转时类型信息以便编译为C,经过这种方法来答应你运用Python代码。

但变通办法历来都不是抱负的。假如咱们能够按原样运用现有的Python程序并以更快的速度运转它,那不是很好吗?这正是PyPy答应你做的作业。


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 代码运转更快的最佳方法!你会了吗?了很长时刻,但到现在为止,python 3版别的速度现已提高了许多。PyPy现在支撑Python 3.5(发布版别)和Python 3.6(beta版别)。

除了支撑一切中心Python言语外,PyPy还能够与Python生态系统中的绝大多数东西合作运用,例如用于打包的pip或用于虚拟环境的virtualenv。大多数Python软件包,即使是那些带有C模块的软件包,都会依照原样运转。当然,也存在一些约束,咱们将在下面介绍一些约束。


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应用程序,而在不存在时疏忽它们。



PyPy的约束


或许看PyPy起来像魔法相同奇特,但其实它并不奇特。 PyPy相同具有某些约束,能够削弱或消除某些程序的有效性。唉,PyPy不是CPython运转时的彻底的通用替代品。

PyPy最适合纯Python的应用程序

PyPy在“纯”Python应用程序中体现最佳,换句话说也便是用Python编写的没有搀杂其他言语的应用程序中体现最佳。因为PyPy仿照CPython的本机二进制接口的寓言故事的成语-让 Python 代码运转更快的最佳方法!你会了吗?方法,与C库(如NumPy)接口的P寓言故事的成语-让 Python 代码运转更快的最佳方法!你会了吗?ython包也没有那么鹤立鸡寓言故事的成语-让 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项目。

感谢看完这篇文章,我想这篇文章会对你有点协助,重视头条号后私信回复“材料”收取一份电子版的材料。