Python 3.15.0 稳定版 10 月 9 日发布,17 个月开发周期,1012 位贡献者,5643 次提交。新特性不少:PEP 661 哨兵类型、PEP 686 UTF-8 默认编码、PEP 798 推导式解包、PEP 810 显式延迟导入、PEP 814 frozendict 内置类型、PEP 829 包级启动配置。实验性 JIT 在 x86-64 Linux 上比解释器快 7% 到 8%,AArch64 macOS 上快 11% 到 12%。
最可能咬人的是 UTF-8 默认
PEP 686 之后,在非 UTF-8 locale 下,用 open() 不传 encoding 参数的代码会以 UTF-8 读取,行为和以前不同。Windows 上用 GBK 的旧代码尤其危险——以前能读的文件现在可能抛 UnicodeDecodeError。
怎么排查
全局搜 open( 调用,凡是没有 encoding= 的都补上。不要依赖默认值,明确写出来是最省事的做法。
延迟导入怎么用
PEP 810 让你可以显式声明某些导入延迟到真正使用时。对启动时间敏感的工具(CLI、短命脚本)收益明显,因为很多库在 import 阶段就做了大量工作。uv 那边已经支持 -X lazy_imports=all 跑构建后端,实测 wheel 构建快了最多 18%。
frozendict 内置
以前要么用第三方库,要么自己包一层。现在有了内置不可变字典,可以作为字典键、可以安全地在多线程间共享。做配置对象时很顺手。
JIT 现在能用吗
还是实验性的。7% 到 8% 的几何平均提升不算惊艳,但对纯 Python 密集的计算型任务值得一试。注意它主要针对 x86-64 Linux 和 AArch64 macOS,其他平台上收益可能不明显。
升级建议
先在 CI 里加一个 3.15 的 job,只跑不通关就先别切默认版本。重点看三类问题:文件读写编码、被移除的废弃 API、C 扩展的 ABI 兼容(自由线程构建现在有了稳定 ABI,但老扩展还是要重编)。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。