17611538698
webmaster@21cto.com

Python 3.13:在性能和规模上开辟新道路

编程语言 1 1010 2024-10-10 05:50:30

图片

各位朋友,今天发布的Python 3.13代表着Python编程语言向前迈出了重要一步。

预计 Python3.13 在性能和开发人员体验方面,实验性的自由线程模式和即时 (JIT) 编译器为未来的改进奠定了坚实基础。

其实此新版本最初计划在 10 月 1 日发布,但由于性能下降而被推迟了一周,所以 Python 最新稳定版本的发布日期也移至 10 月 7 日。

如上我们所述,Python 的一些主要变化包括一个新的 交互式解释器,以及对在 自由线程模式下运行 和 JIT 编译器的实验性支持。

自由线程


实验性的自由线程CPython功能允许在禁用全局解释器锁 (GIL)的情况下运行。它需要单独的可执行文件,可以通过官方 Windows 和 macOS 安装程序安装,也可以从源代码构建。它可以充分利用多核处理器。目前,单线程操作的性能会受到影响。


我们引用 Real Python 作者Bartosz Zaczyński的一篇文章。他这样说:“自由线程试图  从 CPython 中 删除全局解释器锁,这一直是 执行 CPU 密集型任务时实现基于线程的并行性的最大障碍。”“简而言之,GIL 在任何给定时间只允许一个执行线程运行,无论你的 CPU 配备了多少个核心。这会阻止 Python 有效利用可用的计算能力。”


Anaconda社区创新高级总监Stanley Seibert这样评价,从历史上看,Python 的 GIL 阻止了线程的真正并发执行。但是,Python 3.13 中的新实验性功能允许并发执行纯 Python 代码。该功能旨在更好地利用多核处理器,而不会牺牲单线程性能。由于其实验性质,它将在此版本中默认关闭。


Python 的 GIL 的特性由 Meta 的资深工程师开发,并已经得到了 Python 指导委员会的批准。


Seibert 亦表示,Anaconda 正在为社区开发测试包以试用GIL开关功能。


JIT 编译器


关于进一步优化的新 JIT 编译器, Zaczyński 如此写道:


“到目前为止,你只能通过外部工具和库来利用 Python 的各种 JIT 编译器,”“其中一些,如 PyPy 和 Pyjion,提供了或多或少通用的 JIT 编译器,而其他一些,如 Numba,则专注于数值计算等特定用例。”


他写道,Python 3.13 中新的实验性 JIT 编译器使用了一种相当新的名为 copy-and-patch 的算法。


他在文章中指出:“这种编译技术背后的基本思想就是找到一个适合目标 CPU 的预编译机器代码模板,并用缺失的信息(例如变量的内存地址)填充它。”


Zaczyński 还补充说,长期计划是增强 Python 的 JIT,使其在不占用太多额外内存的情况下,能真正显著提高代码执行性能。


Omdia 分析师Brad Shimmin也称 JIT 编译器是“一件大事儿”,因为它使 Python 与 Java 等历史悠久的、以企业为中心的基于 JIT 的语言相比,现在已处于更平等的地位。


他这样说道:


“不仅如此,与传统的 JIT 架构相比,这种 JIT 实现还带来了性能提升,在创建机器代码之前,代码不会经过中间语言,因为这样会非常慢,Python 13.3 的实现采用了复制和修补方法,不需要在 Python 运行时中运行完整的 JIT。”


Forrester Research 分析师Andrew Cornwall认为 Python 3.13 中两个最重要的运行时变化目前是实验性的,“因此日常 CPython 用户暂时不会看到太大差异,”Python 正在为在多个处理器上运行更快的代码奠定基础。


“JIT 编译器一旦启用,可以让 CPython 运行得更快,但 Python 比较保守,目前默认关闭此功能,如果 Python 库支持多线程,那么禁用全局解释器锁的功能可能会更具破坏性,因为它允许 Python 库利用更多内核。开发 C 库的人需要研究禁用 GIL 的影响。但是对于日常用户来说,这些变化还很遥远 — 目前它们位于单独的 python3.13t 二进制文件中。”


自由线程就是尝试使用更多内核。但是,“JIT 编译就是尝试通过提高解释器的效率来充分利用单个内核,”Seibert 说,“现在的版本包含该 JIT 编译器的第一个版本,其目标就是让一切都在无形中变得更快。”


确实,多年来 Python 的速度一直是人们关注的重点,Seibert 说“我知道 Python 历来速度较慢,但编程起来却比其他一些语言更容易。这种 JIT 编译器将它带入了 C 或 C++ 的领域,”他说。


交互式解释器的新改进


同时,大幅改进的交互式解释器具有带历史记录的多行编辑功能、直接支持读取-评估-打印循环(REPL)特定命令(包括帮助、退出和退出)、默认启用颜色的提示和回溯、交互式帮助浏览(F1 键)、历史记录浏览(F2 键)和“粘贴模式”,以便更轻松地粘贴代码(F3 键)。


Seibert 的话说:

“新的交互式解释器增加了一些实用功能,比如着色和同时编辑多行 Python 代码的能力——这些功能以前可以用IPython来实现,但现在它们已经直接内置在解释器中了,”

Python 的新 交互式 shell(默认可用)基于 PyPy 项目的代码。

其他主要变化


此外,Cornwall 表示,Python 3.13 具有增量垃圾收集器实现,可以减少清理分配内存时的长时间暂停。


此外,“平台支持现在包括移动设备(iOS 和 Android 都处于第 3 层,这意味着至少有一名核心开发人员参与)。而Wasm支持已从emscripten转移到WASI,”他说。


底层的更多改进


此外,“有一些弃用的库,比如您使用cgicrypt,则需要寻找替代方案,”Cornwall 说。“语言变化不太可能影响大多数用户。以前未定义的 locals() 语义现在已经定义,但对于大多数开发人员来说,这会非常棘手。使用此版本后,大多数的开发人员会注意到新的外观,但不会注意到引擎盖下的重大变化。”


补充一位注意到内部变化的开发人员是Distributive的软件工程师Tom Tang ,他也是PythonMonkey项目的创建者。


Tang 是PythonMonkey 项目的核心开发人员 ,目前正致力于为 PythonMonkey 提供 Python 3.13 支持。


API 稳定性:PythonMonkey 示例


Tom Tang 表示,作为一名深入研究 Python 底层部分的系统开发人员,他有不同的视角,因此 Python 3.13 中 C API 稳定性的变化是一件值得注意的事情。


Tom Tang 还说,在 3.13 版本之前,Python 的 C API 在每个小版本中都会频繁更改,并且有大量未记录的内部 API 在每次 Python 版本发布时都会被破坏或删除。


“这样会给我们开发 PythonMonkey 带来了一些麻烦,因为 PythonMonkey 承诺支持多个 Python 版本,这非常复杂。在 Python 3.13 中,CPython 核心维护者采取了一项措施来解决 API 不稳定问题,即只提供稳定的公共 API 供使用。大多数未记录的“私有”API 已在 Python 3.13 中删除,其余少数 API 现已记录并升级为稳定 API。”


Tom Tang  说,这一举措对于 Python 扩展开发人员来说非常重要,因为它可以让你继续使用有据可查的 API,并迫使你在处理 Python 的较低部分时真正考虑向后和向前的兼容性。


“另一方面,就 PythonMonkey 而言,由于我们正在处理 CPython 解释器中非常小众的实现细节,以使 PythonMonkey 尽可能快速高效,隐藏‘内部 API’或实现细节可能已经为我们进一步优化 PythonMonkey 以实现更快的跨语言运行时关闭了大门”。

“如果有更正式的 API 来访问内部结构,即使这些成为‘不稳定’ API 的一部分,也会对 PythonMonkey 等深度集成产品有很大的帮助,”唐说。

做好每一件事并做好它


总结下来,Python 3.13 中的变化“是很好的补充,这些变化本身将进一步巩固 Python 作为现有用例中的‘首选’语言的地位,特别是对于数据、AI 和 IT 工程师而言,而且这个版本最具决定性的方面在于速度和规模。


Python 社区对性能和效率的关注,相信会很快解决 Python 目前在性能方面遇到的一些问题。Shimmin 表示,Python 3.13 中的更新“还将在更广泛的用例中更好地巩固 Python 作为‘万能且出色的’语言的新声誉”。

作者:洛逸

评论