Python 3.15 明天正式发布:这 6 个变化,决定你要不要升级

Python 3.15 明天正式发布:这 6 个变化,决定你要不要升级

如果你和我一样,每年十月都会被 Python 的新版本发布刷屏,那今年有个值得记住的日子:2026 年 10 月 9 日(明天),Python 3.15.0 正式版发布。按惯例,新版本总被吹成"改变一切",但 3.15 是个实在版本——功能从 5 月就冻结了,原定 10 月 1 日发布,最后因为懒加载(lazy import)几个边界 bug 修到 10 月 2 日才出第三个候选版,推迟一周。这篇把你升级前真正需要知道的 6 件事讲清楚。

本文信息来自 Python Insider 官方公告 与 Real Python 十月新闻,写于正式版前一天。

先说结论:该不该升级?

  • 个人脚本、CLI 工具:等明天正式版发布后即可尝试,lazy import 一个就能让启动变快。
  • 维护有 C 扩展的包:现在就能发布 3.15 的 wheel——ABI 从 8 月就冻结了,候选版构建的轮子与正式版兼容。
  • 生产服务器:稳一手,等 3.15.1。老规矩。

下面展开讲变化。

1. lazy import:import 终于可以"迟到"了(PEP 810)

这是 3.15 的头牌特性,也是压着发布日期等它的那个特性。新的软关键字 lazy:

lazy import json

print("启动成功")   # 此时 json 还没加载
data = json.loads("{}")  # 第一次用到它时才真正加载

原理很简单:加了 lazy 前缀的 import,在你第一次访问这个模块前都不会执行。启动慢、但重模块只是"偶尔用"的 CLI 工具、agent 工具服务这类场景收益最大——--help 秒回的那种爽快。

注意这是软关键字,如果你自己的代码里有个变量叫 lazy,不会被破坏(软关键字的设计就是为此)。

正式版前修的几个 blocker 挺有代表性:lazy import a.b as c 会被误读成"取属性 b"而不是导入子模块;触发一个子包也会连带把兄弟子模块一起加载。rc3 才修好。所以如果你在 rc2 上试过觉得不对,换 rc3/正式版再测一次。

2. 两个新的内置类型:frozendict 和 sentinel

3.15 新增了两个内置类型,不用再装第三方包:

  • frozendict:不可变的字典。以前冻结配置只能靠第三方包或"约定不许改",现在内置了。适合做函数默认配置、全局常量映射。
  • sentinel:用于"表示缺失值"的哨兵对象。以前大家用 None 凑合,但 None 有时候是合法值:
_MISSING = sentinel("MISSING")  # 以前只能自己写一个哑对象

def fetch(cache_key, default=_MISSING):
    if default is _MISSING:
        raise KeyError(cache_key)   # 明确区分"没传"和"传了 None"

写库作者和框架代码会最先受益,业务代码暂时感受不深。

3. 默认 UTF-8:最可能让你踩坑的"唯一变化"

从 3.15 开始,UTF-8 全面默认:open() 不再看系统 locale 猜编码。这对新代码是好事,但如果你的代码隐含依赖了"本地遗留编码"(比如 Windows 上默认 GBK),升级后读文件行为会变。

自查办法(Real Python 的建议),对项目跑一次测试:

uv run --python 3.15 -X warn_default_encoding -W error::EncodingWarning pytest

凡是 open() 没写 encoding= 的地方都会被转成测试失败,修法也简单:显式传入你真正想要的编码,并给读遗留编码的文件加一条真实文件测试。下午就能扫完,不用等到明天再动手。

4. JIT 终于进入"能用的"阶段

解释器加速这次有两笔账:

  • 升级的 JIT(实验性):加了 tracing 前端,官方基准 x86-64 Linux 上比标准解释器快 7–8%,AArch64 macOS 上比尾调用解释器快 11–12%。注意"实验性、需要构建支持并显式开启",默认不开。
  • Windows 尾调用解释器:官方 64 位 Windows 包换了 VS 2026 构建的尾调用解释器,x86-64 上测出比 switch-case 快 15–20%。

别指望翻倍,但趋势是对的:CPython 的"快一点"工程在稳定推进。免费多线程这边,macOS 官方安装包开始默认附带 free-threaded 构建,ABI 稳定(abi3t)也让扩展作者能为无 GIL 构建发一套轮子。

5. 标准库多了个采样分析器

stdlib 新增采样 profiler,能挂到一个正在运行的进程上采样。以前想看线上进程的热点,要么停服务、要么折腾第三方工具;现在标准库直接给了。不过生产环境接调试工具之前,记得确认你的部署政策允许——功能有了,合规自己管。

6. 有一个"撤退":增量 GC 被回滚了

不是所有变化都是加法。3.14.0 引入的增量垃圾回收器在 3.14.5 被回滚(线上出现内存压力报告),3.15 沿用老的代际 GC。这是它第二次被撤回,顺带给所有人一个提醒:基准测试好看,不等于生产好用。

彩蛋:EVE Online 终于要告别 Python 2

同月的社区新闻里还有一条好玩的:EVE Online 宣布 240 万行 Python 2 代码开始迁移到 Python 3。Python 2 在 2020 年已经 EOL,六年后还有头部项目刚启程——给你的升级计划一点宽容心,也给拖延一点警示。

升级路线图(一句话版)

你是哪种用户建议
个人脚本 / CLI明天正式版后升,顺手体验 lazy import
有 C 扩展的包作者现在就可以发 3.15 wheel,RC 构建的轮子兼容正式版
生产服务等 3.15.1,先跑一遍 -X warn_default_encoding 的自查

如果你去年错过了 Python 3.14 的变化(free-threading 正式支持、模板字符串 t-string),那篇也值得回看——3.14 是 3.15 的地基。

相关链接:Python Insider 3.15.0rc3 公告 · What's New in Python 3.15 · Real Python 十月新闻