2023 年最佳 Python 解释器

2024 年 8 月 29 日 | 阅读 12 分钟

Python 是脚本语言的定义,可以有多种用途。Python 脚本语言采用多种解释器,每种都不同。由于 Python 将成为 2023 年增长最快的编程语言,因此有大量 Python 解释器可用。但是,由于它们都满足不同的需求,因此您必须首先确定最适合您的解释器。

在描述六个最常见的 Python 解释器之前,我们首先对解释器有一个基本的了解。

什么是解释器?

解释器是一种特殊类型的计算机软件,顾名思义,它执行用编码或脚本语言表达的命令。“直接执行”是指无需先将指令构建成翻译后的代码。

Python 解释器

许多出版物和网站都说 Python 是一种解释型编程语言。这在一定程度上是正确的。这是因为其内部工作原理在很大程度上仍然是抽象的,或者用许多 Python 开发人员和程序员的话来说,是神秘的。与其他编程语言不同,Python 不会将其源代码转换为机器可读的指令,以便硬件能够理解它。相反,它将源代码转换为一种称为字节码的格式。

因此,Python 的编译以抽象形式发生,但与 C++ 和 C 等其他编译器不同,Python 的编译不会将整个程序简化到处理器或汇编级别。此外,请记住操作码和汇编级别指令是不同的。这两者之间的根本区别在于,汇编语言是为 CPU 开发的,而字节码是为 VM 和虚拟机生成的。

Python 解释器易于使用,具有以下功能:

  • 引人入胜的编辑
  • 使用先前提示中初始化的变量
  • 使用 readline 工具,在其中编写整个代码。
  • 按 Ctrl+P 将调出命令行编辑,并发出蜂鸣声,让您知道该模式已激活。

之后,我们来看一下最常用的 Python 解释器的简要描述

CPython

CPython 是一个解释器,它提供与 C 和其他编程语言的外部函数接口。它由 C 和 Python 创建。它是 Python 编程语言的默认和最流行的实现。CPython 支持 Python 3.7 版本。

CPython 是标准的 Python 实现,它提供了与 Python 包和 C 扩展模块的最大兼容性。由于 CPython 在解释 Python 代码之前将其转换为字节码,因此它也可以归类为编译器。它采用全局解释器锁 (GIL),其缺点是阻止了进程的并发 Python 线程。因此,所有 Python 编程版本都使用 C 实现。

需要 C 扩展才能正常工作的 Python 包只能与 CPython 一起使用。为了将 Python 编程语言推广给尽可能多的受众,它们必须以 CPython 为目标。

CPython 的特点

  • CPython 的一个独特之处在于,每个进程都使用一个全局解释器锁 (GIL),这可以防止在一个进程中同时有多个线程处理 Python 字节码。这并不是说多线程是无用的;最典型的多线程情况涉及线程大部分时间都在等待其他进程完成。这可能发生在多个线程处理不同客户时。
  • 前两个线程可能正在等待客户端响应,而第三个线程正在执行 Python 代码,第三个线程可能正在等待数据库查询运行。
  • 然而,GIL 确实意味着 CPython 不适合使用 Python 代码实现 CPU 密集型算法的进程,这些算法可以分散到多个核心上。
  • 在实际程序中,GIL 构成严重障碍的情况极为罕见。
  • Python 通常不用于 CPU 密集型或时间敏感型进程,因为它是一种天生缓慢的语言。
  • Python 经常用于高级的特定任务并使用库中的函数。当调用这些底层进程之一时,另一个线程上的 Python 代码可能仍在运行,因为这些库通常不需要用 Python 编写。
  • 用于执行计算密集型活动的非 Python 库不受 GIL 覆盖,并且可以同时运行。

CPython 与其他解释器有何不同?

只有由多任务操作系统控制的不同的 CPython 解释器进程才能使 Python 代码并发运行。这使得并发 Python 进程之间的通信更加困难。但是,多进程模块在一定程度上缓解了这个问题。因此,可以开发受益于并发 Python 代码执行的应用程序,且开销相对较小。

GIL 使得构建多线程应用程序而不利用并发 Python 代码执行以及开发 CPython 变得更加简单。多进程程序必须确保所有通用代码都是线程安全的,而无需 GIL。

尽管有一些关于取消 GIL 的建议,但普遍认为在大多数情况下,其优点大于缺点;在 GIL 成为瓶颈的少数情况下,应用程序应围绕多进程框架设计。

IronPython

IronPython 是 Python 编程语言的 .NET 框架版本,它利用了 Python 和 .NET 框架组件。它还可以使 Python 代码可供其他 .NET 框架语言访问。IronPython 支持 Python 2.7 版本。

IronPython 支持动态编译,其中还包含一个交互式控制台。Python 解释器允许 Python 脚本和 .NET 对象之间进行交互。IronPython 使用适用于 Visual Studio 的 Python 工具箱原生集成到 Visual Studio IDE 中。

IronPython 可能因以下原因对 CPython 程序员有所不同:

  • 企业信誉:在某些组织中添加新技术可能非常具有挑战性;但是,如果 .NET 已经建立良好,则可能不需要使用 IronPython。
  • 无全局解释器锁 - 由于 IronPython 缺乏 GIL,多线程编程可以利用多核处理器。
  • .NET 框架的库非常庞大。特别是,用户界面库 Windows Forms 非常出色。
  • Silverlight!IronPython 比 CPython 更容易扩展(C# 是完全托管的,C# 类型可以直接在 IronPython 中使用,无需封装),并且很容易作为脚本语言集成到 .NET 应用程序中。

Jython

Jython,以前称为 JPython,是基于 Java 平台的 Python 实现。Jython 由 Java 和 Python 创建,将 Python 代码转换为 Java 字节码,使 Python 代码能够在配备 JVM 的任何平台上执行。

Jython 读取整个高级源代码或指令。接下来是语法阶段,该阶段检查每行程序的语法,以确保指令格式正确。如果出现问题,它会立即停止翻译并显示错误消息。

对于静态和动态编译,Jython 都提供支持。众所周知的 Python 解释器能够导入和使用任何 Java 类作为 Python 模块是一个重要功能。Jython 支持 Python 2.7 版本。

如果您需要与纯 Java 代码库交互或为 JVM 构建 Python 代码,那么您可以选择 Jython。

Jython 的用法

  • JBoss 应用服务器的命令行界面、Oracle Weblogic 服务器脚本工具、IBM Rational 开发工具以及使用 wsadmin 的 IBM WebSphere 服务器软件工具都支持 Jython 脚本。
  • Ignition 是一个专注于 HMI 和 SCADA 的软件设计平台。
  • Ghidra 是 NSA 创建的一个逆向工程工具,允许用 Java 或 Jython 构建插件。
  • OpenHAB 是家庭自动化软件。
  • ZK 是一个 Java Ajax 框架,支持用 Jython 编写的胶合逻辑。

PyPy

PyPy 是一个快速且符合标准的 Python 编程语言实现。受限制的静态类型 Python 子集 RPython 用于实现 Python 解释器。PyPy 支持版本 - Python 2.7、Python 3.5 和 Python 3.6。

共同开发的语言 RPython 用于构建 PyPy。RPython(受限 Python)是 Python 的一个子集,它限制了 Python 语言以加快执行速度。其速度是使用它而不是 CPython 的主要原因。特别是,与 CPython 相比,它通常运行速度快 4.4 倍。PyPy 实现了 Python 2.7.13 和 3.6.9。它支持所有基本语言并完成了大多数 Python 2.7 和 Python 3.6 测试套件(有少量修改)。大多数常用的 Python 头文件模块都受支持。这意味着,在大多数情况下,您的编程语言将无需任何调整即可执行。

PyPy 的特点

  • PyPy 支持 CLI、C 和 JVM 后端,并带有一个 JIT 编译器。
  • PyPy 的主要目标是最大限度地兼容基准 CPython 实现,同时提高性能。
  • 想要提高某些特定 Python 程序性能的 Python 程序员会使用 PyPy。
  • 根据 PyPy 网站,流行的 Python 解释器比 CPython 快 4.4 倍。
  • PyPy 使用元追踪方法,通过将解释器转换为追踪 JIT(即时)编译器来执行包含运行时编译的代码。
  • 除了比 Python 运行得更快之外,它还更好地利用了内存。

此外,它与一些最流行的 Python 库具有出色的兼容性。

其中一些是

  • sqlalchemy
  • Lxml
  • twisted
  • ctypes
  • flask
  • pylons
  • divmod 的 nevow
  • Pillow
  • pyglet
  • django
  • NumPy

PyPy 的缺点

PyPy 无法运行每一行 Python 代码。Python 代码可能需要修改才能运行。尽管 PyPy 中重新实现了外部 C-API,但一些 C 抽象有时会泄漏到 CPython 中并被滥用——甚至可能在用户不知情的情况下。由于加载和编译字节码所需的时间需要“热身”时间,这导致应用程序在开始执行时出现非常小到非常明显的延迟。延迟越小,执行性能越差。

通过 PythonNet,原生 Python 安装几乎可以完全与 .NET CLR 集成。它的策略与 IronPython 的策略相反。编译阶段在 Python 编码器执行任何代码之前完成。Python 虚拟机 (PVM) 理解底层结构和平台(操作系统),在内部转换生成的字节码,以便程序可以运行并产生预期结果。PythonNet 支持 Python 2.6 到 Python 3.5 的版本。

PythonNet 允许在非 Windows 操作系统上进行原生 Python 部署,与 Mono 配合在 .NET 框架内运行。PythonNet 和 IronPython 可以毫无问题地一起使用。

Stackless Python

CPython 和其他知名 Python 解释器的栈依赖于 C 调用。而 Stackless Python 解释器则不同。Stackless Python 和 CPython 一样,是用 C 和 Python 创建的。Stackless Python 使用 C 栈,但在函数调用之间会清除。因此,Python 解释器的栈独立于 C 调用。

除了线程之外,Stackless Python 还支持连接、协程、预编译文件、轮询调度、任务序列化和任务。微线程可以说是 Stackless Python 最重要的功能。此功能有助于减少常见操作系统线程带来的开销。Stackless Python 支持 Python 3.7 版本。

特点

  • 使用 Stackless Python,正在执行的程序被分成由 Python 解释器而不是操作系统内核控制的微线程。
  • 由于解释器完全处理任务调度和上下文切换,这有时被称为一种绿色线程。
  • 微线程控制同一 CPU 核心上多个软件子任务的执行方式。
  • 因此,它们是异步计算发生的一种替代方案,并避免了单核应用程序的多个线程的开销,因为不需要从用户模式和操作系统进行模式切换,从而可以降低 CPU 利用率。
  • Stackless Python 不会消除 CPython 的全局解释器锁,并且使用多个线程和进程,即使微线程使得管理单个核心上子任务的执行更容易。
  • 因此,不支持并行性;只支持协作式多任务处理(抢占最初不可用,但现在以某种形式可用)。
  • 在 Stackless Python 进程之上构建进程间通信机制将需要利用多个 CPU 核心。
  • 由于源代码中的大量更改,Stackless Python 无法作为现有 Python 安装的扩展或库进行部署。
  • 相反,它作为一个完整的 Python 发行版独立运行。PyPy(一个自托管的 Python 解释器和 JIT 编译器)也已更新,包含了 Stackless 的大部分功能。

Transcrypt

Python 从一开始就是为大规模编程而设计的。

Transcrypt 支持多重继承、局部类和分层模块,从而实现灵活而可靠的整体结构。Transcrypt 包含一个静态类型验证器、一个代码检查器和一个压缩器,以促进大型项目中的高效团队协作。Python 在后端无处不在,从 Web 应用程序到科学计算。现在它也可以在前端使用。Transcrypt 在 Node.js 之上运行,并提供对任何 JavaScript 库的轻松访问。

Transcrypt 不需要专有附加组件,并且具有 Python 以其强大的、简单的语法而闻名的特点。开箱即用,它支持使用 +、-、*、/ 等进行矩阵和向量运算,以及使用 [i:j:k] 进行字符串切片。您的网站加载速度一如既往地快,因为 JavaScript 目标和 Python 源代码的大小几乎相同。

好处

  • Transcrypt 具有清晰的标准语法。
  • 它预编译为快速、易懂的 JavaScript,可以使用 Python 源代码的源映射进行调试。
  • Transcrypt 具有卓越的可扩展性。
  • Transcrypt 支持一个项目、一种语言。

特点

  • 预编译为高度可读、高效格式的 JavaScript 以 KB 而不是 MB 为单位下载。
  • 纯 Python 3.9 语法,使用 Python 的原生解析器。
  • 多重继承、装饰器、元类、属性、分层模块、可选运算符重载、async/await 等。
  • 需要与高质量互联网插件的宇宙保持持续连接,而不是 MacBook Python 插件。
  • 生成对人类友好的 JavaScript,与 Python 源代码逐行相似,并可选地标记源代码行号。使用集成源映射直接从 Python 源代码进行调试。
  • 它在 node.js 之上运行,并具有闪电般的 Typescript 6 代码:for 循环优化、调用缓存、内联 JavaScript 等。
  • 带有大量代码示例的详尽文档,Apache 2.0 许可证,Pip 安装即可运行!

与 CPython 的主要区别

  • Web 电池:优先访问任何已有的 JavaScript 库,而不是在安装中包含多个 Python 库。一些在浏览器中很重要的库是此规则的例外,例如 cmath、datetime、itertools、math、re、random、time 和 turtle。但是,总的来说,此规则被打破。
  • Transcrypt 旨在让开发人员创建全面、真实的在线应用程序,这些应用程序像其 JavaScript 等效项一样专业且加载速度快,同时更易于维护并提供 Python 式的清晰、模块化结构。不评估或执行任何 Python 代码。这又是该概念的一个组成部分。为了确保快速页面加载,transcrypt 代码已经构建、优化和最小化。在这方面,它的设计目标与即时在浏览器中编译的工具根本不同。
  • 外围是指 Transcrypt 的所有其他组件。即使一个写得很好的外围拉取请求有很大的机会被批准,但仍然建议首先提出问题,以便进行协作并减少精力浪费。

实现标准库具有特定位置。尽管 Transcrypt 主要依赖于浏览器特定的 JavaScript 库,但一些常见库的可用性将有助于 Python 程序员接受它。因此,非常欢迎您在此处做出贡献。设计目标是 90% 完成、快速、小巧、可靠优于 100% 完成、缓慢、庞大、有缺陷。如果您提供一个库,请捐赠一个自动测试(参见文档)和一些支持材料。支持的操作系统是 Linux 和 Windows。

Python 2 还是 Python 3?该如何选择?

  • 自 2008 年推出 Python 3 以来,选择是继续使用更传统的 Python 2 还是采用最新的 Python 3,这始终是一个关键问题。
  • 对于刚学习 Python 的人来说,答案可能很简单:从更新更好的 Python 3 开始。对于拥有大量 Python 代码库且严重依赖 Python 进行运营的企业或个人来说,这个决定可能更加复杂。
  • 截至目前,大多数应用程序都使用 Python 2.7。然而,现在转向 Python 3 的情况越来越普遍。这主要是因为 Python 2.7 将在 2020 年之前获得安全补丁。
  • 如果您正在开发一个新的开源 Python 库,您可以同时为 Python 2 和 Python 3 构建它。这是因为仍有大量 Python 开发人员选择 Python 2。您必须使用 Python 3 来创建新的 Python 应用程序。
  • 由于 Python 3.x 解释器的每个新版本都提供了更好的错误修复、安全性和标准库模块,因此建议使用最新版本。
  • 如果您已经有 Python 2 代码或独特的库,您是否需要坚持使用它?

如果您真的喜欢 Python 2 并且不想切换到 Python 3,那也没关系。但是,请记住,Python 2 在 2020 年之后将不会像现在这样有利可图。因此,最好将 Python 3 与 Python 2 一起使用。

快速总结

这是六个最常用的 Python 解释器的完整列表。其中任何一个都适合您。但它们各有优缺点。因此,做出明智的决定是最好的,尤其是当您从事专业工作时。我希望本教程清楚地概述了 Python 解释器的构成。本教程还解释了 Python 解释器实现高级指令的整体编译和理解过程,利用了 PVM。对许多 Python 解释器有实际的了解可能会很有益。因此,最好尝试更多。


下一主题NumPy 属性