pypy怎么用pypy有多快

全文共2179个字,预计学习时间需要6分钟

照片来源: unsplash

我们提到Python的时候,经常指CPython。 也就是说,是用c语言实现的Python。 这就是PyPy发挥作用的地方。 说实话,Python很慢,但是用Python )写的Python在运行时比CPython运行速度快4.4倍。 这是如何实现的呢?

正如Python的父亲rrdcc 唠叨的朋友van Rossum )所说:“如果想让代码执行得更快,就应该使用PyPy。”

第一次使用PyPy的程序员竞争力很强。 即使花很多时间在Python上创建解决方案,最后也会失败,但在PyPy上运行相同的代码可能会成功。 这是为什么?

不同的方法

Python是说明语言,CPython逐行读取和执行源代码。 包括JavaScript在内的说明语言有很多优点。

容易写

元编程能力强

编译不会失败

当然,也有一些缺点:

分析源代码时,性能消耗很大

编译不会失败

可以看到,好处和坏处包括“不会编译失败”。 虽然这可能基于各种行为,如原型设计和生产,但我倾向于将其视为缺点。 另一方面,PyPy有点不同。 它实现了跟踪即时JIT )编译,而不是纯粹的解释器。

实时编译

实时编译介于解释和传统的预编译之间。 编译器不执行源代码本身,而是生成可以立即执行的低级指令集通常是程序集)。

这幅插图有助于理解它的区别。 在编译语言c、c、Rust )中,编译阶段严格按照开发环境进行划分。 生成可执行的二进制文件并将其发送到生产环境。

说明语言中,源代码*后为hello JS )全部压在生产环境中,由解释程序执行。 虽然即时编译语言也携带源代码或字节代码,如Java和C# ),但它不是逐行解释的,而是编译为普通的编译语言并被执行。

一种方法并不比另一种方法好,每个用例都根据自己的需要指定正确的选择。 但是,如果性能非常重要,并且使用Python解释器时感觉很舒适,请选择PyPy。

跟踪实时编译

与编译和解释一样,实现实时编译也有不同的方法。 传统方法是方法/函数作用域。 当代码调用函数时,即时编译器将检索其源代码,编译它,并提供可执行的二进制文件。 另一方面,PyPy的采用方法略有不同。 这取决于Python的特性和用例。

PyPy的编译器不是每个方法调用的,而是计算循环。 这是最有意义的,因为Python在数据科学、机器学习、高级算法和数据结构中广泛使用。 简单地说,PyPy是Python上面的优化层。

PyPy并不像所理解的那样严格处理循环。 除了常规的for和while结构外,PyPy还会在检测到编译工作有价值时优化任何代码块。

缺点

照片来源: unsplash

当然,PyPy也有缺点。 即使要大幅提高性能,也需要知道以下几点。

不支持所有的Python。 虽然支持大多数代码,但是它处理底层CPython实现的细节,或者如果有Cython绑定,它就不起作用。

回顾未来。 目前的PyPy版本是3.4,但Python目前稳定在3.8,而回溯法是Python开发者擅长的技术。

优化是好事,但不是写坏代码的借口。 如果不能读代码,PyPy怎么能理解呢?

全局解释器锁定仍然存在。 执行负载较重的多线程操作时,请选择其他实现方法。

和任何工具一样,在采用之前必须考虑所有细节。 但是,下次登录Codeforces接受挑战时,请尝试PyPy。 on^3)错误代码有可能通过,但在纯粹的Python中只有o ) On log n )通过。

源代码

本文不包含CPython和PyPy源代码,但这些文件是用cpythonc代码)和PyPy代码)实现阶乘函数的。

电脑:

359 Github.com/python/cpython/blob /主/模块/匹配模块. c

PyPy :

359 Github.com/Mozilla ZG/Pypy/Blob/50D6BF 76E F1F 93 c 234 AB 42D 3B 974 B 9665 D6/PyPY /模块/匹配. 1

其他实施

除了CPython和PyPy之外,还有其他值得注意的Python实现:

堆叠式电脑。 与Python相同,但没有全局解释器的锁定。 用于《星战前夜》游戏的后端。

IronPython是在NET上实现的Python语言,为Python和c#代码提供非常简单的交互操作。

JPython也一样,但是有Java。

使用PyPy体验一下代码加速度吧!

因评论而引人注目

我们一起分享AI学习和发展的干货

转载时,请在后台留言,遵守转载规范

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注