[控场AI]
· 8 分钟阅读· 4,269 字

Python 3.15 正式发布:告别 3.10,迎接 3.11 新特性与懒加载革命

Python 3.15 正式发布:告别 3.10,迎接 3.11 新特性与懒加载革命

Python 3.15 带来懒加载与采样分析器,并解锁 3.11 现代特性。

Python 3.15 正式发布,带来语言与标准库的多项重要更新。PEP 810 显式懒加载允许模块在首次使用时才真正导入,显著改善 CLI 工具与插件系统的启动性能;PEP 798 推导式解包让列表、集合和字典推导式可直接解包,表达更清晰。标准库新增 Tachyon 高频采样分析器,并引入 profiling.sampling 命名空间,使低开销性能分析无需第三方工具。同时 Python 3.10 结束支持,维护者可放心使用 3.11 的 tomllib、asyncio TaskGroup、datetime.UTC 及多项 SQLite 增强。性能方面 3.15 与 3.14 基本持平,仅实验性 JIT 首次展现约 1.2 倍提升。整体来看,这是一个功能增强与生态解锁并重的版本。

Python 3.15 的正式发布标志着 Python 生态的一个重要转折点。这个版本不仅带来了令人兴奋的新功能,还意味着 Python 3.10 正式结束支持周期,让开发者可以放心地拥抱 Python 3.11 引入的现代化特性。

对于维护开源项目的开发者而言,版本迭代始终是一把双刃剑——既要确保代码在所有受支持版本上正常运行,又渴望使用新版本带来的便利。随着 3.15 的发布,这个平衡点终于发生了偏移。

据 Python 官方文档显示,3.15 的 What's New 指南由 3.14 和 3.15 的发布经理 Hugo van Kemenade 亲自策划,其中包含多项值得关注的语言级改进。

Python 3.15 发布

显式懒加载:PEP 810 带来的性能突破

Python 3.15 中最受期待的特性之一,是来自 PEP 810 的显式懒加载(Explicit lazy imports)。这一机制允许开发者以极其直观的方式延迟模块导入:

lazy import json
lazy from pathlib import Path

模块只会在后续代码中首次使用相关符号时才会被真正导入。

这个特性的实际价值远超表面。以 Simon Willison 开发的 LLM CLI 工具为例,该工具支持插件系统,而某些插件依赖如 sentence_transformers 这样的重量级库。在懒加载出现之前,仅仅安装这些插件就会让每次执行 llm 命令增加数秒的启动时间。开发者不得不在插件编写文档中推荐手动实现懒加载技巧。现在,语言层面的原生支持彻底解决了这个痛点。

对于构建 CLI 工具和大型应用的开发者来说,这意味着启动性能的显著提升,同时保持代码的清晰与简洁。

PEP(Python Enhancement Proposal,Python 增强提案)是 Python 社区用于提出、讨论和记录语言或标准库变更的正式文档机制。每一个新语法、新模块或行为调整,通常都先以 PEP 的形式经过公开评审,再由核心开发者决定是否采纳。PEP 编号本身并不代表优先级,而是按提交顺序分配,例如本文明示的 PEP 810 与 PEP 798 都属于具体功能提案。

对开发者而言,PEP 文档是理解某项特性设计动机、边界条件和兼容性影响的第一手资料。它通常包含摘要、动机、规范、向后兼容性讨论等章节。当你在项目中评估是否采用某个新特性时,直接查阅对应 PEP 往往比二手教程更可靠,因为其中会明确说明该特性在哪些解释器版本可用,以及是否存在意外的运行时行为。

推导式解包与采样分析器

PEP 798 引入的推导式解包语法为数据处理带来了更优雅的表达方式。新语法允许在列表、集合和字典推导式中直接使用解包操作:

lists = [[1, 2], [3, 4], [5]]
[*L for L in lists]

性能分析器通常分为跟踪(tracing)与采样(sampling)两类。跟踪分析器如 `cProfile` 会对函数调用、返回等事件逐次挂钩记录,因此统计精确,但会显著拖慢程序运行,并且结果容易受插桩本身干扰。采样分析器则按固定时间间隔抓取调用栈快照,依据样本分布估算各函数耗时占比,开销小到可以用于接近生产环境的负载。

采样分析的代价是时间分辨率有限:执行极短的函数可能被漏采,导致统计偏差。因此它更适合发现“热点路径”而非做精确计时。火焰图是采样分析常见的可视化形式,横轴反映样本占比,纵轴反映调用深度,能够直观暴露耗时集中的调用链。Tachyon 作为标准库内置的高频采样器,意味着无需再安装第三方工具或修改代码,就能对运行中的进程进行低干扰诊断。
# 结果: [1, 2, 3, 4, 5]

这种写法等价于嵌套循环的推导式,但可读性更强,意图更明确。该提案由 Adam Hartz 和 Erik Demaine 提出,是对 2015 年 Python 3.5 中 PEP 448 解包语法的自然延伸。

另一个重磅更新是标准库中新增的采样分析器。原有的跟踪分析器 cProfile 被重命名为 profiling.tracing,同时引入了一个名为 Tachyon 的高频统计采样分析器,即 profiling.sampling。

采样分析器通过定期捕获运行进程的堆栈跟踪来计算函数耗时,开销极低且无需预先插桩。开发者此前需要使用 py-spy 等第三方工具才能获得这种能力,现在它已成为标准库的一部分。对于拥有 PID 的运行中 Python 3.15 进程,只需执行:

sudo uv run --python 3.15 python -m profiling.sampling attach 1234

采样器会生成包含样本数、采样百分比、累计时间等详细信息的报告,并能输出火焰图和热力图,甚至支持 Firefox Profiler UI 格式。

性能对比与升级路径

3.15 与 3.14 的性能差异

据开发者 Miguel Grinberg 对 3.15.0rc3 版本的测试,Python 3.15 的整体性能与 3.14 基本持平,唯一的例外是实验性 JIT。在斐波那契测试中,JIT 带来了相对于标准解释器 1.2 倍的性能提升,这是 Miguel 首次观察到有意义的 JIT 性能改进。

回顾 Miguel 此前对 3.14 的测试,该版本在多个类别中相对 Python 3.13 都有显著提升。这意味着 3.15 更像是一个功能增强版本,而非性能飞跃版本。

JIT(Just-In-Time,即时编译)指的是在程序运行过程中,将热点字节码动态编译为机器码,以减少解释执行的开销。CPython 长期以来以解释执行为主,JIT 一直是社区追求但推进缓慢的方向。Python 3.13 起引入的实验性 JIT 采用“复制并修补”策略,逐步将解释器特化后的指令翻译为机器码,而非从零构建完整编译器。

实验性意味着它默认未必启用,且实现仍在演进,可能存在编译开销、内存占用或行为差异。因此在评估 JIT 收益时,需要区分标准解释器与开启 JIT 后的表现。斐波那契这类纯计算基准主要衡量函数调用与算术循环,未必能代表 I/O 密集或依赖 C 扩展的真实应用。JIT 首次出现有意义的提升是积极信号,但距离全面改变性能格局仍有距离。

使用 uv 升级到 Python 3.15

对于使用 uv 管理 Python 环境的开发者,升级流程相当简洁。首先更新 uv 本身以确保其识别新版本:

uv self update
uv python install 3.15
uv python pin --global 3.15

最后一条命令将 3.15 设为所有 uv run 命令的默认版本,除非项目本身固定了其他版本。对于通过 uv tool install 安装的工具,可以使用 uv tool upgrade datasette --python 3.15 重新安装并指定 Python 版本。

拥抱 Python 3.11:终于可以使用的特性

Python 3.15 的发布意味着 2021 年发布的 Python 3.10 正式结束支持。对于坚持在所有受支持版本上运行代码的开源项目维护者来说,这标志着一个重要的解锁时刻。

标准库的新成员

tomllib 模块终于可以放心使用了。这个在 3.11 中引入的 TOML 解析库已经成为许多项目的依赖,现在不再需要为 3.10 兼容性做额外处理。

对于重度使用 asyncio 的项目如 Datasette,3.11 带来的 TaskGroup 和 timeout() 等特性将大幅简化并发代码的编写。datetime.UTC 别名也让时区处理更加简洁。

SQLite 支持的显著增强

Python 3.11 对 SQLite 的支持进行了多项重要升级,这些改进对数据密集型应用尤为关键:

  • setlimit() 和 getlimit() 方法允许从 Python 层面设置 SQLite 运行时限制
  • create_window_function() 支持用 Python 类创建自定义窗口函数,只需实现 step()、value()、inverse() 和 finalize() 方法
  • blobopen() 为大型 BLOB 二进制值提供了高效的局部读写机制
  • set_authorizer(None) 现在可以移除 SQLite 授权器,Datasette 项目此前为此维护了一个变通方案

此外,Python 3.11 在类型提示系统方面也有大量改进,这些都将逐步惠及整个生态。

生态影响与展望

Python 3.15 的发布不仅仅是版本号的递增,它代表着一个开发范式的转变。懒加载解决了长期困扰 CLI 工具和插件系统的启动性能问题,标准库中的采样分析器降低了性能调优的门槛,而对 3.11 特性的解锁则让开发者可以更自由地使用现代 Python 的表达能力。

对于开源项目维护者而言,现在正是规划升级路径的最佳时机。建议先通过 cookiecutter 模板更新项目配置,将测试矩阵扩展到 Python 3.11 至 3.15,然后逐步移除针对旧版本的兼容性代码。

Simon Willison 已经迈出了第一步,他的 Datasette 项目正在移除 set_authorizer(None) 的变通方案,同时 click-app、datasette-plugin、python-lib 和 llm-plugin 等模板项目都已更新为针对 Python 3.11 至 3.15 进行测试。

Python 3.15 或许不是一个性能飞跃的版本,但它带来的开发体验提升和生态解锁效应,将在未来数月乃至数年内持续显现。

#Python 3.15#Python 3.11#PEP 810#懒加载#采样分析器#uv 工具#Python 发布
分享:

相关推荐