Python 3.15 落地:UTF-8 成了默认,frozendict 进内建,JIT 再快一档

Python 3.15.0 于 10 月 9 日发布,含 5643 个提交、1012 位贡献者。按「会改你代码行为」的顺序,讲清 UTF-8 默认、惰性导入、frozendict 与 JIT。

Python 3.15.0 在 10 月 9 日发布,官方页面的数字是 5,643 个提交、1,012 位贡献者。写这篇文章时它已经被 3.15.1 取代 —— 这句话本身就是提醒:新大版本的头几个补丁版别急着上生产。

最可能改你行为的一条:UTF-8 成为默认

PEP 686 让 Python 默认使用 UTF-8 编码。对 Linux / macOS 上写惯了 UTF-8 的人是「终于」,对 Windows 上依赖系统代码页(GBK、cp1252)的脚本是行为变更:open() 不写 encoding 时的默认值、locale.getpreferredencoding() 相关路径、以及子进程与文件名的处理都会跟着变。

升级前最实用的动作不是读 PEP,而是把项目里所有「没写 encoding」的 open()、subprocess 调用、Path.read_text() 抓出来,显式写死编码。这条改动不会报错,它只会在某个含中文或重音字符的输入上悄悄给你乱码。

语言层:惰性导入与两个内建类型

  • PEP 810 显式惰性导入:把导入推迟到真正使用时,直接收益是启动时间;代价是模块的副作用时机变了,依赖「import 即注册」的插件式代码要复核。
  • PEP 814 frozendict:不可变字典终于进内建。以前要么用 MappingProxyType(不可哈希),要么自己包一层;现在它是真类型,可以当缓存键。
  • PEP 661 sentinel:给「缺省值」一个正经的哨兵类型,替代 object() 那种靠 id 比较的土办法。
  • PEP 798 推导式里的解包、PEP 829 包启动配置文件:前者让推导式里混写解包更自然,后者把「包级别启动时要做的事」收进声明式配置。

JIT:数字不大,但方向对了

官方给的是几何均值:在 x86-64 Linux 上比标准解释器快 7–8%,在 AArch64 macOS 上比尾调用解释器快 11–12%。注意这两个基准不同 —— 第二个是和「尾调用解释器」比,不是和 3.14 的默认配置比,引用时别混。

分析工具与类型系统

PEP 799 带来 Tachyon:一个高频统计采样 profiler,以及一个专门组织 Python 分析工具的包。对「线上服务想低开销采样」的场景,这比 cProfile 的现实可用性高一档。

类型侧:PEP 728 让 TypedDict 能声明「额外允许的键」(以前只能整体 total=False 糊过去),PEP 747 引入 TypeForm,用来标注「类型表达式本身」这种参数。

一句判断

3.15 没有 3.10 那种「match 语句」级别的爆点,但它把三件长期欠账还了:编码默认值、不可变字典、以及一个像样的采样 profiler。升级顺序建议是:先在 CI 上加 3.15 跑测试(重点盯编码相关断言),再谈生产;生产直接上 3.15.1。

数据来源:Python 官方发布页《Python 3.15.0》(2026-10-09)。

← 返回文章列表

评论

…