Python 是一种最流行的编程语言,它需要一个解释器来执行 Python 代码定义的指令。与其他直接编译成机器代码的语言相比,解释器负责读取 Python 代码并将其指令翻译给 CPU 执行相关操作。 有多种解释器,在本文中,我将介绍其中的一些。
解释器入门
在谈论 Python 解释器时,通常指的是 /usr/bin/python
二进制文件。 这让你能够执行 .py
文件。
但是,解释只是其中一项任务。在 CPU 上实际执行一行 Python 代码之前,需要执行以下四个步骤:
- 词法分析 - 人工编写的源代码被转换为一系列逻辑实体,即所谓的词法标记。
- 语法分析 - 在语法分析器中,检查词法标记的语法和文法。 语法分析器的输出是一个抽象语法树 (AST)。
- 编译 - 基于 AST,编译器创建 Python 字节码。 字节码由非常基本的、平台无关的指令组成。
- 解释 - 解释器获取字节码并执行指定的操作。
如你所见,在采取任何实际操作之前,需要执行很多步骤。 仔细研究不同的解释器是有意义的。
1. CPython
CPython 是 Python 的参考实现,也是许多系统上的默认实现。 顾名思义,CPython 是用 C 编写的。
因此,可以用 C 编写扩展,从而使广泛使用的基于 C 的库代码可供 Python 使用。 CPython 适用于各种平台,包括 ARM、iOS 和 RISC。 但是,作为该语言的参考实现,CPython 经过了仔细的优化,但并不专注于速度。
2. Pyston
Pyston 是 CPython 解释器的一个分支,它实现了性能优化。 该项目将自身描述为标准 CPython 解释器的替代品,适用于大型、实际应用程序,加速潜力高达 30%。 由于缺少兼容的二进制包,Pyston 包必须在下载过程中重新编译。
3. PyPy
PyPy 是 Python 的 即时 (JIT) 编译器,它使用 RPython(Python 的静态类型子集)编写。 与 CPython 解释器相比,PyPy 编译为机器代码,该代码可以直接由 CPU 执行。 PyPy 是 Python 开发人员的试验场,他们可以更轻松地试验新功能。
PyPy 比参考 CPython 实现更快。 由于 JIT 编译器的性质,只有运行很长时间的应用程序才能从缓存中受益。 PyPy 可以作为 CPython 的替代品。 但是,存在一个缺点。 C 扩展模块主要受支持,但它们的运行速度比 Python 扩展模块慢。 PyPy 扩展模块是用 Python(而不是 C)编写的,因此 JIT 编译器能够对其进行优化。 只要你的应用程序不依赖于不兼容的模块,PyPy 就可以很好地替代 CPython。 项目网站上有一个专门的页面,详细描述了与 CPython 的区别: PyPy 和 CPython 之间的区别
4. RustPython
顾名思义,RustPython 是用 Rust 编写的 Python 解释器。 虽然 Rust 编程语言是相当新的,但它越来越受欢迎,并且有望成为 C 和 C++ 的继任者。 默认情况下,RustPython 的行为类似于 CPython 的解释器,但它也有一个 JIT 编译器,可以选择启用它。 另一个不错的功能是 Rust 工具链允许你直接编译为 WebAssembly,并且还允许你完全在浏览器中运行解释器。 它的演示可以在 rustpython.github.com/demo 上找到。
5. Stackless Python
Stackless Python 将自身描述为 Python 编程语言的增强版本。 该项目基本上是 CPython 解释器的一个分支,它向该语言添加了微线程、通道和调度程序。 微线程允许你将代码构建到任务中,从而使你能够并行运行代码。 这种方法与使用 greenlet 模块的绿色线程相当。 通道可用于任务之间的双向通信。 Stackless Python 的著名用户是大型多人在线角色扮演游戏 Eve Online。
6. Micro Python
如果你以微控制器为目标,那么 MicroPython 是不二之选。 它是一个精益实现,只需要 16kB 的 RAM 和 256kB 的空间。 由于它面向嵌入式环境,MicroPython 的标准库只是 CPython 广泛的 STL 的一个子集。 为了开发和测试或作为轻量级替代方案,MicroPython 也可以在普通的 x86 和 x64 机器上运行。 MicroPython 适用于 Linux、Windows 以及许多微控制器。
性能
从设计上讲,Python 是一种天生缓慢的语言。 根据任务的不同,解释器之间的性能差异很大。 要大致了解哪种解释器最适合特定任务,请参阅 pybenchmarks.org。 使用解释器的替代方法是将 Python 二进制代码直接编译为机器代码。 例如,Nuitka 就是可以将 Python 代码编译为 C 代码并从 C 代码编译为机器代码的项目之一。 然后使用普通的 C 编译器将 C 代码编译为机器代码。 Python 编译器的主题非常全面,值得单独撰写一篇文章。
总结
Python 是一种用于快速原型设计和自动化任务的绝佳语言。 此外,它易于学习,非常适合初学者。 如果你通常坚持使用 CPython,那么看看你的代码在另一个解释器上的表现可能会很有趣。 如果你使用 Fedora,你可以轻松地测试其他一些解释器,因为软件包管理器已经提供了正确的二进制文件。 请查看 fedora.developer.org 了解更多信息。
3 条评论