Python 发布 3.13 版本,人工智能与机器学习的潜在颠覆者!
Python 3.13 版本近期发布,其中包含了多项重大更新。作为机器学习、数据科学和人工智能领域应用最广泛的编程语言,Python 一直在不断发展以满足这些领域日益增长的需求。最新版本 Python 3.13 提供了多项旨在提升性能和效率的改进,对于从事机器学习和人工智能项目的开发者来说,这是一个重要的里程碑。
Python 在机器学习和人工智能领域的优势主要在于其简洁性、丰富的库支持以及庞大的社区。然而,随着人工智能领域的不断扩展,对更高性能和效率的 Python 代码的需求变得至关重要。Python 3.13 引入了自由线程和即时编译 (JIT) 等实验性功能,可以显著提升计算密集型工作负载的性能,而这些工作负载在机器学习训练和推理任务中非常常见。
1. 实验性自由线程 CPython (PEP 703)
长期以来,全局解释器锁 (GIL) 一直是 Python 的一个限制因素,尤其是在需要多线程的任务中。GIL 会阻止多个原生线程同时执行 Python 字节码,这可能会成为机器学习模型训练等 CPU 密集型操作的瓶颈。尽管 Python 支持多线程,但 GIL 确保在任何给定时间只有一个线程在解释器中运行,这使得充分利用多核处理器变得困难。
对于涉及大型数据集和 CPU 密集型计算的机器学习工作负载来说,GIL 会严重限制性能。开发者通常不得不依赖多进程等变通方法,但这会增加复杂性和开销。
自由线程执行简介
Python 3.13 引入了对自由线程执行的实验性支持,允许 Python 在没有 GIL 的情况下运行。这是该语言执行模型的重大变化。移除 GIL 意味着 Python 现在可以支持真正的多线程,允许多个线程在不同的内核上同时运行。
这为更快地执行多线程应用程序打开了大门,而无需切换到外部库或多进程框架。
对机器学习工作负载的好处
- 并行数据处理:在没有 GIL 限制的情况下并行运行 CPU 密集型任务的能力意味着数据预处理、特征提取和模型评估等 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 执行中,代码在运行时逐行解释。虽然这很灵活且易于调试,但对于计算密集型任务(例如机器学习和人工智能中经常遇到的任务)来说,速度可能会很慢。
- JIT 编译:JIT 编译器不会解释每一行代码,而是识别出代码中反复使用的“热点”部分,并将它们编译成机器代码。这可以加快执行速度,因为机器代码可以直接在 CPU 上运行,而无需解释的开销。
Python 3.13 引入了实验性的 JIT 编译器,作为 PEP 744 的一部分,旨在加快 Python 程序的执行速度。虽然此功能仍处于早期阶段,但它标志着在提高 Python 处理繁重计算任务(包括机器学习和人工智能中常见的任务)的性能方面迈出了重要一步。
内部架构和优化阶段
Python 3.13 中的 JIT 编译器通过将 Python 代码中频繁执行的部分转换为优化的机器代码来工作。以下是它的工作原理:
- 第一层字节码:Python 代码首先像往常一样转换为字节码。
- 热点代码检测:JIT 识别出代码中经常运行的部分(“热点代码”)。
- **中间表示 (IR)**:热点代码被转换为一种称为第二层中间表示 (IR) 的内部格式,这种格式更容易优化。
- 优化:IR 经过各种优化过程以提高性能。
- 机器代码生成:最后,优化的 IR 被转换为机器代码,其运行速度比原始 Python 字节码快得多。
这种方法允许 Python 有选择地只编译代码中最常用的部分,从而在无需手动干预的情况下提高性能。
对机器学习和人工智能开发的影响
- 性能提升:对于机器学习和人工智能工作负载(其中大型数据集和复杂计算很常见),Python 的 JIT 编译器可以带来显著的好处:
更快地执行 Python 代码:通过优化代码中的热点,JIT 编译器可以减少训练循环、数据处理和实时推理任务所花费的时间。
减少开销:由于 JIT 编译器根据使用情况有选择地编译代码,因此它减少了对持续解释的需求,从而使 Python 在应用程序的关键部分的表现更像一种编译语言。
- 对训练循环和实时推理的好处:
- 训练循环:在训练机器学习模型时,循环通常需要处理大量数据并执行重复计算。JIT 编译器可以优化这些循环,从而缩短训练时间。
- 实时推理:对于需要实时预测的应用程序(例如人工智能驱动的服务),JIT 编译器可以通过加快推理过程来减少延迟。
未来优化
尽管 Python 3.13 中 JIT 编译器的初始收益并不大,但开发者可以预期在未来的版本中会有持续的改进。随着 JIT 变得更加健壮和智能,它将能够处理更复杂的优化,从而带来更大的性能提升。
如何使用 JIT 编译器
要在 Python 3.13 中启用 JIT 编译器,您需要使用实验性 JIT 选项构建 Python:
- 构建 Python:从源代码构建 Python 时,请使用--enable-experimental-jit 选项。
- 运行时激活:您可以使用PYTHON_JIT 环境变量在运行时控制 JIT 编译器的激活。要启用 JIT,请设置PYTHON_JIT=1。您可以通过设置PYTHON_JIT=0 来禁用它。
关于实验状态的说明
JIT 编译器在 Python 3.13 中仍处于实验阶段。默认情况下它是禁用的,开发者应该谨慎使用它,尤其是在生产环境中。随着 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() 装饰器,允许开发者将函数标记为已弃用。此警告在运行时和类型系统中都会引发,从而使开发者清楚地知道不再建议使用某个函数。
好处
- 标记已弃用的函数:此功能允许机器学习工程师清楚地标记已过时或将在未来版本中删除的函数。
- 协助代码重构:在处理长期机器学习项目时,有效地管理弃用至关重要。此装饰器简化了识别已弃用功能并随着时间的推移对其进行重构的过程。
3.3 只读 TypedDict 项 (PEP 705)
typing.ReadOnly 简介
Python 现在允许您将 TypedDict 中的某些项指定为只读。这是使用新的 typing.ReadOnly 功能完成的,该功能可以防止在设置特定字段后对其进行修改。
好处
- 防止意外修改:在机器学习项目中,配置和模型参数通常存储在字典中。通过将字段标记为只读,您可以确保在运行时不会意外更改关键参数。
- 确保数据完整性:此功能有助于维护数据结构的完整性,尤其是在复杂的机器学习管道中。
3.4 使用 typing.TypeIs 进行类型缩小 (PEP 742)
typing.TypeIs 用于类型缩小的说明
新的 typing.TypeIs 功能提供了比现有的 typing.TypeGuard 更直观的类型缩小行为。它允许类型检查器根据条件细化变量的类型,从而实现更精确的类型推断。
好处
- 提供更直观、更精确的类型检查:此功能通过确保在执行期间正确缩小类型范围来帮助开发者编写更安全的代码。
- 减少运行时错误:通过在开发早期捕获类型错误,此功能可以显著降低运行时问题的可能性,这在数据密集型机器学习项目中特别有用。
4. 使用“asyncio”改进并发性
在人工智能和机器学习中,高效地管理异步任务至关重要,尤其是在需要实时数据处理、模型推理或与多个 API 交互的环境中。Python 3.13 对 asyncio 模块进行了一些重要更新,改进了其在这些苛刻场景中处理并发性和任务管理的能力。
Python 3.13 的一项重大改进是增强了 asyncio.TaskGroup。任务组允许多个异步任务一起管理,从而更容易处理它们的整个生命周期,尤其是在处理取消或错误时。
好处
- 可靠的任务取消和错误处理:在以前版本的 Python 中,在复杂的机器学习管道中,任务取消和错误管理更难稳健地处理。借助改进的TaskGroup,开发者现在可以更轻松地管理这些流程,确保任何故障或取消都能得到妥善处理。这对于涉及大型数据集、流数据或同时使用多个数据源的机器学习任务特别有用。
- 对于管理异步操作至关重要:许多机器学习和人工智能应用程序依赖于异步操作,例如实时流式传输数据或同时处理多个请求。增强的TaskGroup 确保此类任务能够高效完成,并更有效地管理任何潜在问题,从而降低管道停滞或瓶颈的风险。
用于服务器管理的新方法
Python 3.13 为 asyncio 框架引入了两种用于管理服务器连接的新方法:Server.close_clients() 和 Server.abort_clients()。这些新方法使开发者能够更好地控制其异步服务器进程,这在处理多个客户端时(例如在人工智能驱动的 API 或 Web 服务中)至关重要。
好处
- 更好地控制服务器连接:新方法允许精确控制客户端连接的生命周期。close_clients() 有助于优雅地关闭连接,而abort_clients() 则在必要时强制终止连接。这些功能对于机器学习和人工智能服务非常有用,在这些服务中,实时处理来自各个客户端的并发连接至关重要。
- 对于人工智能服务和 API 至关重要:人工智能驱动的应用程序通常需要同时处理多个客户端请求,例如在人工智能即服务 (AIaaS) 平台中。有效管理连接的能力对于维护此类服务的可靠性和性能至关重要。这些新方法使开发者能够更灵活、更可控地处理这些连接。
5. 标准库增强
Python 3.13 还对标准库进行了一些更新,这些更新与机器学习和人工智能工作流程高度相关。这些增强功能有助于改进数据管理、提高效率并简化机器学习和人工智能开发中许多典型任务的代码。
5.1. base64 模块增强
其中一项更值得注意的更新是添加了 base64.z85encode() 和 base64.z85decode() 函数。Z85 编码格式比传统的 base64 更紧凑,使其成为编码二进制数据的理想选择。
好处
- 高效编码二进制数据:许多人工智能应用程序涉及处理二进制数据,例如模型权重、图像数据或序列化神经网络。Z85 编码格式提供了一种更节省空间的方式,以文本友好的格式对这些数据进行编码,使其更易于通过网络传输或存储在数据库中。
- 促进数据传输和存储:Z85 编码对于在预期使用文本的系统(例如 JSON API 或数据库)之间传输数据特别有用。通过高效地编码二进制数据,开发者可以节省存储空间和带宽,同时保持与那些更喜欢文本数据格式的系统的兼容性。
5.2. copy 模块更新
Python 3.13 引入了新的 copy.replace() 函数,该函数简化了使用修改克隆对象的过程。这对于经常使用复杂数据结构(例如神经网络配置或超参数)的机器学习和人工智能从业者来说尤其有用。
好处
- 简化克隆和修改复杂对象:在机器学习和人工智能工作流程中,通常需要复制模型配置或数据集等对象,但只需稍作修改。例如,在调整超参数或调整模型架构时,能够以一种简洁、高效的方式复制和替换值可以加快开发过程。
- 有助于调整神经网络配置:在迭代机器学习模型时,通常会复制现有配置,同时进行一些小的更改(例如,更改层参数或优化器设置)。copy.replace() 函数允许您轻松创建复杂对象的修改副本,而无需手动修改每个参数。
5.3. 新的 dbm.sqlite3 模块
Python 3.13 中另一个有价值的补充是新的 dbm.sqlite3 模块,该模块提供了一种轻量级的、基于文件的数据库解决方案,使用 SQLite 作为后端。SQLite 在许多机器学习应用程序中广泛用于存储元数据、结果或其他键值数据。
好处
- 轻量级的、基于文件的数据库解决方案:对于需要简单数据库解决方案的机器学习项目,例如存储模型元数据、缓存中间结果或管理配置,dbm.sqlite3 模块提供了一种易于使用的、基于文件的数据库,而无需设置完整的数据库服务器。
- 非常适合存储元数据和缓存结果:在机器学习工作流程中,通常需要一个快速、轻量级的数据库来管理元数据或缓存中间计算的输出。dbm.sqlite3 模块利用了 SQLite 的简单性和性能,使其成为此类用途的理想选择。
6. 安全性和可靠性改进
Python 3.13 对安全性和可靠性进行了重要更新,这对于经常涉及敏感数据和计算的人工智能应用程序来说尤为重要。这些增强功能确保机器学习和人工智能应用程序能够更安全、更可靠地运行,尤其是在分布式环境中。
SSL 增强
Python 3.13 的一项关键改进是对 ssl.create_default_context() 方法的更新。它现在设置了更严格的默认标志,为网络通信提供了增强的安全性。
好处
- 增强网络通信的安全性:新的默认设置有助于确保 SSL/TLS 配置在默认情况下更安全。这对于依赖基于云的服务或 API 的人工智能应用程序来说尤为重要,这些应用程序通常通过 HTTPS 或其他安全协议进行交互。
- 对人工智能应用程序至关重要:许多人工智能驱动的应用程序(例如数据处理管道和基于云的机器学习服务)都需要安全的通信,以确保数据完整性和隐私。这些更严格的默认设置有助于防止网络通信中的漏洞,确保敏感数据(例如用户输入或模型预测)能够安全传输。
引入“PythonFinalizationError”异常
Python 3.13 还引入了 PythonFinalizationError 异常,当在解释器的终止阶段尝试某些操作时会引发此异常。这是一项关键的补充,可确保在关闭期间正确清理资源。
好处
- 有助于识别和正确处理清理操作:在机器学习和人工智能应用程序中,通常会分配大量资源,例如 GPU、文件句柄和数据集。PythonFinalizationError 帮助开发者查明在关闭期间导致问题的操作,确保安全释放这些资源。
- 确保正确释放 GPU 和数据文件等资源:在使用 GPU 等硬件加速器或存储在内存中的大型数据集时,必须确保在应用程序生命周期结束时释放这些资源。新的异常有助于在清理过程中捕获错误,防止潜在的资源泄漏,并确保机器学习管道顺利关闭。
7. 平台支持更新
Python 3.13 大幅扩展了平台支持,使其更容易在不同环境(包括移动设备和 Web 浏览器)中部署机器学习和人工智能模型。对于希望构建能够在更广泛的设备上运行的人工智能应用程序的开发者来说,这些更新开辟了新的可能性。
对 iOS (PEP 730) 和 Android (PEP 738) 的官方支持
Python 首次在 Tier 3 层级上正式支持 iOS 和 Android 平台。对于希望将人工智能模型和服务引入移动设备的开发者来说,这是一项重大更新。
好处
- 简化人工智能模型在移动设备上的开发和部署:人工智能模型现在可以更轻松地部署在 iOS 和 Android 设备上,无论是作为独立应用程序还是作为更大的移动人工智能平台的一部分。这对于需要在边缘设备上实现实时机器学习功能的应用程序(例如图像分类、目标检测或增强现实)至关重要。
- 扩大人工智能应用程序的覆盖范围:通过正式支持 iOS 和 Android,Python 使人工智能开发者能够接触到更广泛的用户。移动人工智能助手、健康监测应用程序和实时分析工具等应用程序现在可以受益于 Python 强大的机器学习框架。
WebAssembly 支持
Python 3.13 还通过支持 wasm32-wasi 作为 Tier 2 平台,将 WebAssembly (Wasm) 支持提升到了一个新的水平。
好处
- 能够在 Web 环境中运行 Python 人工智能代码:借助 WebAssembly,开发者可以直接在 Web 浏览器中运行 Python 代码,从而实现客户端机器学习应用程序。这对于轻量级的、实时的机器学习任务(例如图像或文本分析)特别有用,这些任务可以在浏览器本地处理,而无需服务器端计算。
- 为浏览器中的客户端机器学习应用程序开辟了可能性:借助 WebAssembly 支持,开发者可以直接在浏览器中部署机器学习模型。这为创建交互式、注重隐私的应用程序开辟了可能性,在这些应用程序中,数据在客户端进行处理,从而减少了向服务器传输数据的需求。
8. 发布计划变更(PEP 602 更新)
Python 3.13 延长了版本支持周期,使开发者能够更轻松地规划长期项目并保持兼容性。
延长全面支持期限
PEP 602 中最值得注意的变化之一是将 Python 版本的全面支持(“错误修复”)期限从一年半延长至两年。这意味着 Python 版本现在将获得更长时间的全面支持,然后是三年的安全修复。
好处
- 为人工智能项目提供更长的稳定性:对于需要长期稳定性的人工智能项目,此扩展的支持窗口意味着开发者可以更长时间地依赖 Python 3.13,而无需频繁升级。这对于部署在生产环境中并需要长时间保持稳定的人工智能模型尤为重要。
- 减少主要升级的频率:更长的支持期限减少了在 Python 版本之间频繁迁移的需求,从而最大限度地减少了对正在进行的机器学习项目的干扰,并减少了与代码库重构或升级相关的开销。
对长期项目的影响
更长的支持期限提供了更可预测的维护计划,使人工智能团队能够更有策略地规划升级。
好处
- 更可预测的维护计划:凭借两年的全面支持期限,机器学习工程师可以更好地规划其升级周期,因为他们知道错误修复和安全更新将在更长时间内提供。
- 更容易规划未来的更新和兼容性:人工智能项目,尤其是在医疗保健、金融或自动驾驶系统等行业,需要长期稳定性和谨慎的升级规划。Python 3.13 扩展的发布计划使其更容易将这些项目与未来的 Python 版本保持一致,确保版本之间的平稳过渡。
如果您从事机器学习和人工智能方面的工作,现在是探索 Python 3.13 中新功能的最佳时机。在您的开发环境中测试实验性的自由线程和 JIT 编译器,看看它们如何改进您的工作负载。深入了解增强的类型系统和平台支持,以简化您的开发和部署工作流程。
虽然 Python 3.13 带来了强大的新功能,但有些功能(如自由线程解释器和 JIT 编译器)仍处于实验阶段。在将这些功能部署到生产环境之前,必须在开发环境中对其进行全面测试,以确保稳定性以及与现有代码库的兼容性。
本文转载自 DevOpsAI,作者: Python