Python 3.15 发布:懒加载导入、采样分析器与 3.11 特性解锁
Python 3.15 已发布。对需要兼容所有受支持 Python 版本的开源项目来说,这也意味着 Python 3.10 正式退出支持范围,项目可以开始更放心地使用 Python 3.11 引入的能力。
下面是 Python 3.15 中几个值得关注的变化,以及升级后对项目维护者的影响。
Python 3.15 亮点
显式懒加载导入
Python 3.15 引入了 PEP 810 中的显式懒加载导入语法:
lazy import json
lazy from pathlib import Path
使用这种写法后,模块不会在语句执行时立即导入,而是在后续代码第一次使用这些符号时才真正加载。
这对命令行工具和插件系统尤其有用。许多插件会依赖体积较大、导入较慢的库,例如 sentence_transformers。如果插件在启动时就被普通导入,即使当前命令并不需要相关功能,也可能让每次 CLI 调用额外增加数秒启动时间。显式懒加载导入正是为降低这类启动成本提供了语言层面的支持。
推导式中的解包语法
Python 3.15 还加入了 PEP 798:在推导式中使用解包。新的语法可以写成:
lists = [[1, 2], [3, 4], [5]]
[*L for L in lists] # [1, 2, 3, 4, 5]
# 等价于 [x for L in lists for x in L]
sets = [{1, 2}, {2, 3}, {3, 4}]
{*s for s in sets} # {1, 2, 3, 4}
# 等价于 {x for s in sets for x in s}
dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
{**d for d in dicts} # {'a': 3, 'b': 2}
# 等价于 {k: v for d in dicts for k, v in d.items()}
这可以看作是 PEP 448 解包语法的进一步扩展。PEP 448 早在 Python 3.5 中就已引入。
标准库新增采样分析器
Python 原有的 tracing profiler 从 cProfile 更名为 profiling.tracing。与此同时,Python 3.15 新增了名为 Tachyon 的采样分析器,对应模块为 profiling.sampling。
采样分析器会周期性捕获运行中进程的调用栈,然后据此计算哪些函数消耗了最多时间。它的开销较低,并且不需要提前对程序做插桩,就能观察正在运行的系统。
如果已经有一个 Python 3.15 进程的 PID,可以通过类似命令开始采样:
sudo uv run --python 3.15 python -m profiling.sampling attach 1234
在 macOS 上可能需要 sudo。运行一段时间后按 Ctrl+C 停止采样,就可以看到性能报告。
该工具还可以生成火焰图、热力图,并能输出可在 Firefox profiler UI 中查看的格式。过去开发者可能会使用 py-spy 一类外部工具完成类似工作,如今这项能力进入了标准库。
Python 3.15 相比 3.14 性能提升有限
Miguel Grinberg 曾基于 Python 3.15.0rc3 测试 3.15 的性能,结论是整体表现与 Python 3.14 基本相近。例外是实验性 JIT:在 Fibonacci 测试中,JIT 相比标准 3.15 解释器带来了约 1.2 倍提升。这是他首次观察到 JIT 带来有意义的性能增益。
相比之下,他此前对 Python 3.14 的测试显示,3.14 相比 Python 3.13 在更多类别上有显著提升。
使用 uv 升级到 Python 3.15
如果使用 uv 管理 Python 版本,可以按以下步骤安装并切换到 Python 3.15。
首先更新 uv 本身,确保它识别新版本:
uv self update
安装 Python 3.15 稳定版:
uv python install 3.15
将 3.15 设置为全局默认版本。除非项目本身锁定了其他版本,否则后续 uv run 会使用它:
uv python pin --global 3.15
确认版本:
uv run python --version
如果此前已经通过 uv tool install 安装了一些工具,也可以重新指定 Python 3.15 进行升级,例如:
uv tool upgrade datasette --python 3.15
随后可以用工具自身的版本信息接口进行确认,例如:
datasette --get /-/versions.json | jq
Python 3.10 退役后,可以开始使用 3.11 特性
Python 3.15 发布后,2021 年发布的 Python 3.10 已不再受官方支持。对于那些策略是“兼容所有受支持 Python 版本”的项目来说,现在可以放弃 3.10,并开始依赖 Python 3.11 引入的功能。
几个值得关注的 Python 3.11 特性包括:
tomllib 进入标准库
Python 3.11 提供了 tomllib,可以直接读取 TOML 文件,不再总是需要额外依赖。
asyncio 增强
对于大量使用 asyncio 的项目,Python 3.11 增加了:
asyncio.TaskGroupasyncio.timeout()- 以及其他多项
asyncio改进
这些能力可以简化异步任务组织与超时控制。
datetime.UTC
Python 3.11 新增了 datetime.UTC,它是 datetime.timezone.utc 的别名。
SQLite 支持增强
Python 3.11 对 sqlite3 模块也有多项重要增强:
setlimit()与getlimit():允许从 Python 设置和读取 SQLite 运行时限制。create_window_function():允许用 Python 创建自定义窗口函数,类中可实现step()、value()、inverse()、finalize()方法。blobopen():为 SQLite 行中大型BLOB二进制值提供高效的局部读写机制。set_authorizer(None):现在可以用来移除 SQLite authorizer,一些项目中针对该问题的绕行代码可以删除。
类型系统改进
Python 3.11 还包含一系列类型标注相关改进。对于积极使用类型提示的项目,这些变化也值得评估并逐步采用。
对维护者的意义
Python 3.15 的发布不只是新增语法和工具,也改变了开源项目的兼容性边界。随着 Python 3.10 退出支持,项目维护者可以减少旧版本兼容负担,并开始把 Python 3.11 中的标准库、异步、SQLite 和类型系统改进纳入代码库。
同时,Python 3.15 的显式懒加载导入和标准库采样分析器,分别针对启动性能和运行时诊断提供了更直接的语言与工具支持。对于 CLI、插件系统、长时间运行服务和性能分析场景,这些变化都值得尽早关注。
