导航菜单

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

先锋影音av

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

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

b4468f2fd88741439dbacfef61f1ce44.jpeg

作者| Serdar Yegulalp

翻译|姜松浩,主编|涂敏

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

多年来,开发人员已经为Python的速度限制提出了各种解决方法。例如,您可以在C中编写性能密集型任务,并将其包装在Python中,就像许多机器学习库一样。或者您可以使用Cython,这个项目允许您将运行时类型信息添加到C以编译为C,这样就可以使用Python代码。

但解决方法从来都不是理想的。如果我们能够使用现有的Python程序并更快地运行它,那不是很好吗?这正是PyPy允许你做的事情。

PyPy和CPython

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

根据正在执行的任务,性能改进可能很重要。平均而言,PyPy将Python加速7.6倍,将某些任务加速50倍或更多。 CPython解释器根本不执行与PyPy相同的优化,也可能永远不会,因为这不是它的设计目标之一。

最好的部分是开发人员很少或根本没有努力来释放PyPy提供的好处。只需用PyPy替换CPython,大部分都完成了。下面讨论了一些例外情况,但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模块的软件包,都会按原样运行。当然,有一些限制,我们将在下面介绍一些限制。

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的本机二进制接口的方式,与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项目。

原文:

本文翻译为CSDN,请注明出处。

【END】

3340b8b827f44c88ae6f52726adada32.jpeg