Python3.13来了!封神

科技   2024-12-10 09:15   广东  

来源:数据STUDIO

一样是学IT的,凭什么爬虫轻松过万?

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 . 13tpython3.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. 第 1 层字节码 :Python 代码首先像往常一样转换成字节码。
  2. 热代码检测:JIT 会识别代码中经常运行的部分(“热代码”)。
  3. 中间表示(IR):热代码会被翻译成一种内部格式,称为**第 2 层中间表示法 (IR)**,这种格式更易于优化。
  4. 优化:对 IR 进行各种优化,以提高性能。
  5. 机器代码生成:最后,优化后的 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 的TypeVarParamSpecTypeVarTuple泛型现在支持默认值。这意味着,当您定义泛型类或函数时,现在可以指定默认类型参数,如果没有提供特定类型,将使用默认类型参数。

对多语言代码库的好处

  • 简化通用类和函数的定义:在机器学习中,使用通用类来处理数据结构、模型或配置是很常见的。有了默认类型参数,您就可以减少模板代码,使代码库更加简洁。
  • 增强代码的可读性和可维护性:定义默认类型的能力使代码更简洁、可读性更高,在大型项目中更易于维护。

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()方法。现在,它设置了更严格的默认标志,为网络通信提供了更高的安全性。

优势

  • 增强网络通信的安全性:新的默认值有助于确保 SSL/TLS 配置开箱即用,更加安全。这对于依赖基于云的服务或 API 的人工智能应用尤为重要,因为这些服务或 API 通常通过 HTTPS 或其他安全协议进行交互。
  • 对人工智能应用至关重要:许多人工智能驱动的应用,如数据处理管道和基于云的 ML 服务,都需要安全通信来确保数据完整性和隐私。这些更严格的默认设置有助于防范网络通信中的漏洞,确保用户输入或模型预测等敏感数据的安全传输。

引入PythonFinalizationError 异常

Python 3.13 还引入了 “PythonFinalizationError”异常,当在解释器的终结阶段尝试某些操作时,该异常就会引发。这是一项重要的新增功能,可确保在关闭过程中正确清理资源。

优势

  • 有助于识别和正确处理清理操作:在机器学习和人工智能应用中,分配 GPU、文件句柄和数据集等大型资源是很常见的。PythonFinalizationError可帮助开发人员找出在关闭过程中造成问题的操作,确保这些资源被安全释放。
  • 确保正确释放 GPU 和数据文件等资源:在使用 GPU 等硬件加速器或内存中存储的大型数据集时,确保在应用程序生命周期结束时释放这些资源至关重要。新异常有助于在清理过程中捕获错误,防止潜在的资源泄漏,确保顺利关闭 ML 管道。

7. 平台支持更新

Python 3.13 大幅扩展了平台支持,使在不同环境(包括移动设备和网络浏览器)中部署 ML 和 AI 模型变得更加容易。这些更新为希望构建可在更多设备上运行的人工智能应用程序的开发人员带来了新的可能性。

正式支持 iOS(PEP 730)和 Android(PEP 738)

Python 首次在第 3 级正式支持 iOS 和 Android 平台。对于希望将人工智能模型和服务引入移动设备的开发人员来说,这是一次重大更新。

优势

  • 简化移动设备上人工智能模型的开发和部署:人工智能模型现在可以更轻松地部署在 iOS 和 Android 设备上,无论是作为独立的应用程序还是作为更大的移动人工智能平台的一部分。这对于需要在边缘设备上实现实时 ML 功能的应用(如图像分类、物体检测或增强现实)来说至关重要。
  • 扩大人工智能应用的覆盖范围:通过正式支持 iOS 和 Android,Python 使人工智能开发人员能够接触到更广泛的受众。移动人工智能助手、健康监测应用程序和实时分析工具等应用现在都可以受益于 Python 强大的 ML 框架。

支持 WebAssembly

Python 3.13 支持wasm32-wasi作为二级平台,从而将WebAssembly (Wasm) 支持提升到一个新的水平。

优势

  • 支持在 Web 环境中运行 Python AI 代码:有了 WebAssembly,开发人员可以直接在网络浏览器中运行 Python 代码,从而实现客户端 ML 应用程序。这对于轻量级实时 ML 任务(如图像或文本分析)尤其有用,因为这些任务可在浏览器中进行本地处理,而无需服务器端计算。
  • 为浏览器中的客户端 ML 应用提供了可能性:有了 WebAssembly 支持,开发人员可以直接在浏览器中部署机器学习模型。这为创建注重隐私的交互式应用提供了可能性,在客户端处理数据,减少了向服务器传输数据的需要。

8. 发布时间表变更(PEP 602 更新)

Python 3.13 延长了发布支持周期,使开发人员更容易规划长期项目并保持兼容性。

全面支持周期延长

PEP 602 中最显著的变化之一是将 Python 版本的完全支持期(“错误修复”)从一年半延长到了两年。这意味着 Python 版本将在更长的时间内获得全面支持,并在三年内获得安全修复。

优势

  • 为人工智能项目提供更长的稳定性:对于需要长期稳定性的人工智能项目来说,延长支持窗口意味着开发人员可以在更长的时间内依赖 Python 3.13,而无需频繁升级。这对于部署在生产环境中并需要长期保持稳定性的人工智能模型尤为重要。
  • 降低重大升级频率:较长的支持期可减少 Python 版本之间频繁迁移的需要,从而最大限度地减少对正在进行的 ML 项目的干扰,并降低与重构或升级代码库相关的开销。

对长期项目的影响

延长支持期可提供更可预测的维护计划,让人工智能团队更有战略性地规划升级。

优势

  • 更可预测的维护计划:有了两年的全面支持期,ML 工程师可以更好地规划升级周期,因为他们知道错误修复和安全更新将在更长的时间内可用。
  • 更轻松地规划未来更新和兼容性:人工智能项目,尤其是医疗保健、金融或自主系统等行业的人工智能项目,需要长期的稳定性和周密的升级计划。Python 3.13 的扩展发布计划使这些项目更容易与未来的 Python 版本保持一致,确保了不同版本之间的平稳过渡。

如果您正在从事机器学习和人工智能方面的工作,现在正是探索 Python 3.13 新特性的最佳时机。在您的开发环境中测试试验性自由线程和 JIT 编译器,看看它们如何改善您的工作负载。深入了解增强的类型系统和平台支持,以简化您的开发和部署工作流程。尽管 Python 3.13 带来了强大的新特性,如自由线程解释器和 JIT 编译器,但它们仍处于试验阶段。在生产环境中部署这些功能之前,必须在开发环境中进行全面测试,以确保其稳定性以及与现有代码库的兼容性。

作者:Muhammad Saad Uddin




扫码加我微信,围观朋友圈,拓展视野






码农逆袭
致力于码农逆袭•搞钱思维•技术提升•职场突围•思维跃迁,15万+码农成长翻身第一站,陪有梦想的你一起成长。
 最新文章