Python 3.13 于近期发布,其中包含大量重要更新。Python 作为机器学习、数据科学和人工智能领域使用最广泛的编程语言,一直在不断发展,以满足这些领域日益增长的需求。最新发布的 Python 3.13 提供了多项具有影响力的改进,旨在提高性能和生产力,对于从事 ML 和 AI 项目的开发人员来说是一个重要的里程碑。Python 在 ML 和 AI 领域的主导地位主要归功于它的简单性、广泛的库支持和庞大的社区。然而,随着人工智能领域的扩展,对性能更强、效率更高的 Python 代码的需求变得至关重要。Python 3.13 引入了自由线程和 JIT(JIT)编译等实验性功能,这些功能可以显著提高计算密集型工作负载的性能,而计算密集型工作负载在 ML 训练和推理任务中很常见。
1.
实验性自由线程 CPython(PEP 703)
全局解释器锁(GIL)
是 Python 中一个长期存在的限制,尤其是对于需要多线程的任务。GIL 会阻止多个本地线程同时执行 Python 字节码,这可能会导致与 CPU 绑定的操作(如 ML 模型训练)出现瓶颈。即使 Python 支持多线程,GIL 也会确保解释器在任何时候都只能运行一个线程,因此很难充分利用多核处理器。
对于涉及大型数据集和重型 CPU 计算的机器学习工作负载,GIL 会严重限制其性能。开发人员通常不得不依靠多处理等变通方法,这增加了复杂性和开销。
自由线程执行简介
Python 3.13 引入了
对自由线程执行的实验性支持
,允许 Python 在
没有 GIL 的情况
下运行。这是对语言执行模型的巨大改变。取消 GIL 意味着 Python 现在可以支持真正的多线程,使多个线程可以在不同的内核上同时运行。
这为更快地执行多线程应用程序打开了大门,而无需切换到外部库或多处理框架。
机器学习工作负载的优势
并行数据处理
-
并行运行受 CPU 约束的任务
:能够在没有 GIL 限制的情况下跨多个线程执行任务,这意味着数据预处理、特征提取和模型评估等 CPU 密集型操作现在可以在真正的并行模式下运行,从而显著加快工作流程。
性能提升
-
提高模型训练速度
:对于机器学习模型的训练,尤其是在处理大型数据集或复杂算法时,自由线程可大幅缩短完成训练周期所需的时间。
-
减少对多处理的需求
:在 Python 早期版本中,开发人员不得不使用多进程来绕过 GIL。这通常会导致更高的内存消耗和开销。有了新的自由线程模式,这些难题都可以得到缓解,从而使代码更简洁、更高效。
如何启用自由线程
在 Python 3.13 中启用自由线程需要使用特殊版本的解释器:
-
自由线程构建
:要利用此特性,请使用指定用于自由线程的联编,如
python3
.
13t
或
python3.13t.exe
。
-
从源代码编译
也可以使用
--disable-gil
选项编译 Python,以手动构建自由线程版本。
-
检查支持
:要确认解释器是否已禁用 GIL,请运行
python -VV
或检查
sys._is_gil_enabled() 的
输出。
注意事项和限制
虽然自由线程的概念很有前途,但它仍处于
实验阶段
。在生产环境中使用它之前,有几件事需要注意:
-
潜在错误
:由于这是一项实验性功能,可能会出现一些不可预见的问题或错误,从而影响稳定性。
-
单线程应用程序的性能
:如果没有 GIL,单线程性能可能会因管理多个线程的额外开销而受到影响。
-
重建 C 扩展模块
:对于依赖于 GIL 的 C 扩展模块,您需要重新构建它们,以确保与 Python 的自由线程版本兼容。
2.
引入 JIT 编译器 (PEP 744)
JIT 编译器
是一种在程序运行过程中将部分代码编译成机器语言,而不是提前编译,从而提高程序性能的系统。这使得代码运行速度更快,因为可以根据程序的实时使用情况进行某些优化。
与传统口译的区别
-
传统解释
:在典型的 Python 执行中,代码是在运行时逐行解释的。虽然这种方式灵活且易于调试,但对于计算密集型任务(如在 ML 和 AI 中经常遇到的任务)来说,速度可能较慢。
-
JIT 编译
:JIT 编译器不解释每一行代码,而是识别代码中重复使用的
“热门
”部分,并将其编译成机器代码。由于机器代码可直接在 CPU 上运行,无需解释,因此执行速度更快。
Python 3.13 在 PEP 744 中引入了一个
实验性的 JIT 编译器
,旨在加快 Python 程序的执行速度。虽然该功能仍处于早期阶段,但它标志着 Python 在提高繁重计算任务(包括 ML 和 AI 中常见的任务)的性能方面迈出了重要一步。
内部架构和优化阶段
3.13 中的 Python JIT 编译器通过将 Python 代码中频繁执行的部分转换为优化的机器码来工作。下面是它的工作原理:
-
第 1 层字节码
:Python 代码首先像往常一样转换成字节码。
-
热代码检测
:JIT 会识别代码中经常运行的部分(“热代码”)。
-
中间表示(IR)
:热代码会被翻译成一种内部格式,称为**第 2 层中间表示法 (IR)**,这种格式更易于优化。
-
-
机器代码生成
:最后,优化后的 IR 被翻译成机器码,机器码的运行速度比原始 Python 字节码要快得多。
这种方法允许 Python 选择性地只编译代码中最常用的部分,无需人工干预即可提高性能。
对 ML 和 AI 开发的影响
性能提升
对于机器学习和人工智能工作负载(常见的是大型数据集和复杂计算),Python 的 JIT 编译器可以提供显著的优势:
-
更快地执行 Python 代码
:通过优化代码中的热点,JIT 编译器可以减少训练循环、数据处理和实时推理任务所花费的时间。
-
减少开销
:由于 JIT 编译器会根据使用情况选择性地编译代码,因此减少了持续解释的需要,使 Python 在应用的关键部分表现得更像编译语言。
训练循环和实时推理的优势
-
训练循环
:在训练机器学习模型时,循环通常需要处理大量数据并执行重复计算。JIT 编译器可以优化这些循环,从而加快训练时间。
-
实时推理
:对于需要实时预测的应用(如人工智能驱动的服务),JIT 编译器可以通过加快推理过程来减少延迟。
未来的优化
尽管 Python 3.13 中的 JIT 编译器最初带来的收益不大,但开发人员可以期待未来版本中的
持续改进
。随着 JIT 变得越来越强大和智能,它将能够处理更复杂的优化,从而带来更大的性能提升。
如何使用 JIT 编译器
要在 Python 3.13 中启用 JIT 编译器,需要使用实验性 JIT 选项构建 Python:
-
编译 Python
.NET 从源代码构建 Python 时使用
--enable-experimental-jit
选项。
-
运行时激活
:您可以使用
PYTHON_JIT
环境变量来控制 JIT 编译器在运行时的激活。要启用 JIT,请设置
PYTHON_JIT=1
。设置
PYTHON_JIT=0
则可禁用
JIT
。
实验状态说明
在 Python 3.13 中,JIT 编译器仍处于
试验阶段
。默认情况下它是禁用的,开发者应谨慎使用它,尤其是在生产环境中。随着 JIT 的发展,它可能会在未来的 Python 版本中成为更稳定、更高效的工具。
3.
增强的类型功能
Python 3.13 还对其类型系统进行了多项改进,使开发人员更容易编写清晰、可维护和类型安全的代码。这些更新在大规模机器学习项目中尤其有用,因为数据类型的清晰有助于避免运行时错误。
3.1 带有默认值的类型参数(PEP 696)
TypeVar、ParamSpec 和 TypeVarTuple 默认值介绍
Python 的
TypeVar
、
ParamSpec
和
TypeVarTuple
泛型现在支持
默认值
。这意味着,当您定义泛型类或函数时,现在可以指定默认类型参数,如果没有提供特定类型,将使用默认类型参数。
对多语言代码库的好处
-
简化通用类和函数的定义
:在机器学习中,使用通用类来处理数据结构、模型或配置是很常见的。有了默认类型参数,您就可以减少模板代码,使代码库更加简洁。
-
增强代码的可读性和可维护性
:定义默认类型的能力使代码更简洁、可读性更高,在大型项目中更易于维护。
3.2 过时装饰器(PEP 702)
warnings.deprecated()
装饰器的解释
Python 3.13 引入了
warnings.deprecated()
装饰器,它允许开发者将函数标记为已废弃。该警告会在运行时和类型系统中发出,让开发者清楚地知道某个函数已不再推荐使用。
优势
-
标记已废弃的函数
:此功能允许 ML 工程师明确标记过时或将在未来版本中删除的函数。
-
协助代码重构
:在开展长期的 ML 项目时,有效管理弃用功能至关重要。该装饰器简化了识别过时功能和随时间重构的过程。
3.3 只读 TypedDict 项目 (PEP 705)
typing.ReadOnly
简介
Python 现在允许您将
TypedDict
中的某些项指定为
只读
。这是使用新的
typing.ReadOnly
特性实现的,它可以防止特定字段在设置后被修改。
优势
-
防止意外突变
:在 ML 项目中,配置和模型参数通常存储在字典中。通过将字段标记为只读,可以确保关键参数不会在运行时意外更改。
-
确保数据完整性
:该功能有助于维护数据结构的完整性,尤其是在复杂的机器学习管道中。
3.4 使用
typing.TypeIs
进行类型缩小(PEP 742)
类型缩小的
typing.TypeIs
解释
与现有的
typing.TypeGuard
相比,新的
typing.TypeIs
功能提供了更直观的类型缩小行为。它允许类型检查程序根据条件完善变量类型,从而实现更精确的类型推断。
优势
-
提供更直观、更精确的类型检查
:该功能可确保在执行过程中正确缩小类型范围,从而帮助开发人员编写更安全的代码。
-
减少运行时错误
:通过在开发过程中尽早捕获类型错误,该功能可显著降低运行时出现问题的可能性,这在数据密集型 ML 项目中尤为有用。
4.
利用
“asyncio ”
提高并发性
在人工智能和 ML 中,高效管理异步任务至关重要,尤其是在需要实时数据处理、模型推理或与多个 API 交互的环境中。Python 3.13 为
asyncio
模块带来了几项重要更新,提高了它在这些要求苛刻的场景中处理并发和任务管理的能力。
Python 3.13 的主要改进之一是增强了
asyncio.TaskGroup 功能
。任务组允许将多个异步任务放在一起管理,从而更容易处理它们的生命周期,尤其是在处理取消或错误时。
优势
-
可靠的任务取消和错误处理
:在 Python 以前的版本中,任务取消和错误管理在复杂的 ML 管道中很难稳健处理。有了改进后的
TaskGroup
,开发人员现在可以更轻松地管理这些流程,确保优雅地处理任何故障或取消。这对于涉及大型数据集、流数据或同时处理多个数据源的机器学习任务尤其有用。
-
对管理异步操作至关重要
:许多 ML 和 AI 应用程序都依赖于异步操作,例如实时数据流或同时处理多个请求。增强的
TaskGroup
可确保高效完成此类任务,并更有效地管理任何潜在问题,从而降低管道停滞或瓶颈的风险。
服务器管理的新方法
Python 3.13 为
asyncio
框架引入了两个用于管理服务器连接的新方法:
Server.close_clients()
和
Server.abort_clients()
。这些新方法为开发人员提供了对异步服务器进程的更大控制,这在处理多个客户端(如人工智能驱动的 API 或网络服务)时至关重要。
优势
-
更好地控制服务器连接
:新方法允许对客户端连接的生命周期进行精确控制。
close_clients()
可帮助优雅地关闭连接,而
abort_clients
(
)
则可在必要时强制终止连接。这些功能对于实时处理来自不同客户端的并发连接的 ML 和 AI 服务非常重要。
-
对人工智能服务和应用程序接口至关重要
:人工智能驱动的应用程序通常会同时处理多个客户端请求,例如在人工智能即服务(AIaaS)平台中。有效管理连接的能力对于保持此类服务的可靠性和性能至关重要。这些新方法使开发人员能够以更强的控制力和灵活性来处理这些连接。
5.
标准库的增强
Python 3.13 还对与机器学习和人工智能工作流程高度相关的标准库进行了多项更新。这些增强功能有助于改进数据管理,提高效率,并简化 ML 和 AI 开发中许多典型任务的代码。
5.1.
base64
模块增强
其中一个更显著的更新是增加了
base64.z85encode()
和
base64.z85decode()
函数。Z85 编码格式比传统的 base64 更为紧凑,因此成为编码二进制数据的一个有吸引力的选择。
优势
-
二进制数据的高效编码
:许多人工智能应用都需要处理二进制数据,如模型权重、图像数据或序列化神经网络。Z85 编码格式提供了一种空间效率更高的方式,可将这些数据编码为文本友好格式,使其更易于通过网络传输或存储到数据库中。
-
方便数据传输和存储
:Z85 编码尤其适用于在 JSON API 或数据库等需要文本的系统间传输数据。通过对二进制数据进行有效编码,开发人员可以节省存储空间和带宽,同时与偏好文本数据格式的系统保持兼容。
5.2.
copy
模块更新
Python 3.13 引入了新的
copy.replace()
函数,简化了克隆修改对象的过程。这对于经常处理复杂数据结构(如神经网络配置或超参数)的机器学习和人工智能从业人员来说尤为重要。
优势
-
简化复杂对象的克隆和修改
:在 ML 和 AI 工作流程中,经常需要复制模型配置或数据集等对象,但要稍作修改。例如,在调整超参数或调整模型架构时,如果能以简洁、高效的方式复制和替换值,就能加快开发过程。
-
有助于调整神经网络配置
:在对机器学习模型进行迭代时,通常会复制现有的配置,同时进行一些小的更改(如层参数或优化器设置)。通过
copy.replace()
函数,您可以轻松创建复杂对象的修改副本,而无需手动修改每个参数。
5.3.
新的
dbm.sqlite3
模块
Python 3.13 的另一个重要新增功能是新的
dbm.sqlite3
模块,它提供了一个基于文件的轻量级数据库解决方案,使用 SQLite 作为后端。SQLite 广泛应用于许多 ML 应用程序,用于存储元数据、结果或其他键值数据。
优势
-
基于文件的轻量级数据库解决方案
:对于需要简单数据库解决方案(如存储模型元数据、缓存中间结果或管理配置)的机器学习项目,
dbm.sqlite3
模块提供了一个易于使用、基于文件的数据库,无需设置完整的数据库服务器。
-
存储元数据和缓存结果的理想选择
:在 ML 工作流程中,通常需要一个快速、轻量级的数据库来管理元数据或缓存中间计算的输出结果。
dbm.sqlite3
模块利用了 SQLite 的简单性和性能,使其成为实现这一目的的理想选择。
6.
安全性和可靠性改进
Python 3.13 带来了安全性和可靠性方面的重要更新,这对于经常涉及敏感数据和计算的人工智能应用尤为重要。这些增强功能确保机器学习和人工智能应用能够更安全、更可靠地运行,尤其是在分布式环境中。
SSL 增强
Python 3.13 的主要改进之一是更新了
ssl.create_default_context()
方法。现在,它设置了更严格的默认标志,为网络通信提供了更高的安全性。
优势