全文共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。 o(n^3)错误代码有可能通过,但在纯粹的Python中只有o ) O(n log n )通过。
源代码
本文不包含CPython和PyPy源代码,但这些文件是用cpython(c代码)和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学习和发展的干货
转载时,请在后台留言,遵守转载规范