Python 3.15 正式发布:写脚本的人要知道的 7 个新特性

Python 3.15 正式发布:写脚本的人要知道的 7 个新特性

先说背景:这篇讲什么

Python 是目前最流行的脚本语言之一:写爬虫、做自动化、跑定时任务,十有八九离不开它。2026 年 10 月 9 日,Python 的年度大版本 3.15.0 正式发布——1,012 位贡献者、5,643 个提交。因为懒导入功能在最后关头查出 bug,官方 10 月 2 日临时多打了一个 RC3,正式版比原计划晚了一周。

这篇不谈语言设计哲学,只讲写脚本的人真正用得上的 7 个变化:哪些能让你的脚本更快、更稳、更少踩坑,以及到底该不该升级。前置知识:会写 Python 脚本,会用 venv / pip 就够了。

1. 懒导入 lazy import(PEP 810):脚本启动终于能提速了

痛点场景:你写了个小工具,import 了一堆重型模块(requests、pandas、numpy),但用户只是跑个 --help,也要等所有模块加载完。以前的土办法是把 import 挪进函数里,又丑又容易忘。

3.15 给了官方写法:在 import 前加一个 lazy 关键字——

lazy import json
lazy import requests
lazy import pandas as pd

def main():
    data = pd.read_csv("report.csv")  # 第一次真正用到 pd 时,模块才加载

声明时只登记名字、不加载,第一次真正使用时才加载,行为和普通 import 完全一致。模块作者还可以声明 __lazy_modules__,让别人 import 它时自动走懒加载;老项目也可以通过环境变量或编程方式让普通 import 变懒,不用大改代码。

想量化效果:python -X importtime your_script.py 2> import.log,对比懒导入前后的模块加载耗时。

2. frozendict(PEP 814):配置常量终于有官方不可变字典

以前想写"只读配置",要么用 types.MappingProxyType 包一层,要么干脆靠自觉。现在内置了:

DEFAULTS = frozendict({"timeout": 30, "retries": 3})
DEFAULTS["timeout"] = 60   # TypeError:不允许修改

几个关键特性(官方文档明确写的):

  • 不是 dict 的子类——isinstance(x, dict) 会返回 False,老代码里靠这个做类型判断的要注意;
  • 键和值都可哈希时,整个 frozendict 也可哈希——能直接当字典的 key、放进 set,写缓存 key 很顺手;
  • 保留插入顺序,但比较时与顺序无关:frozendict(y=2, x=1) == frozendict(x=1, y=2) 为 True。

json、pickle、copy 等标准库已经适配了它。

3. sentinel(PEP 661):缺省值标记不用再手搓 object()

写函数时经常要区分"用户没传参数"和"用户传了 None":

NOT_SET = sentinel("NOT_SET")

def fetch(url, timeout=NOT_SET):
    if timeout is NOT_SET:      # 注意用 is 判断
        timeout = DEFAULT_TIMEOUT
    ...

以前大家手写 _MISSING = object(),repr 难看、pickle 麻烦、类型检查也不友好。官方的 sentinel("名字") 一次解决:is 比较、repr 友好、模块级定义的可 pickle。

4. UTF-8 默认(PEP 686):Windows 中文乱码的万恶之源没了

open("日志.txt").read() 不写 encoding 参数时,以前在 Windows 上跟系统 locale 走(中文系统通常是 GBK),在 Linux / macOS 上是 UTF-8——同一份脚本换台机器就乱码。3.15 起默认 UTF-8,三端行为统一。

如果老项目恰好依赖旧行为,设环境变量 PYTHONUTF8=0 可退回。升级建议:新脚本继续显式写 encoding="utf-8"(跨版本最稳);升级前 grep 一下老代码里没写 encoding 的 open。

5. Tachyon 采样分析器(PEP 799):脚本慢在哪,挂上去就知道

新增的 profiling 包里带了一个叫 Tachyon 的统计采样分析器:最高每秒采样一百万次,有 wall(耗时)、cpu(CPU 时间)、gil(GIL 占用)、exception 四种模式,能直接挂到正在运行的进程上(按 PID),不用重启、不用改代码。以后调优慢脚本,不用再靠 print 计时了。

6. 推导式里能解包了(PEP 798)

一句话:在推导式里也可以用 * 做解包拼接,拼列表、拆参数更顺手。属于"写起来更爽"的小改进。

7. JIT 又快了一步,但先别激动

实验性 JIT 编译器在 x86-64 Linux 上比标准解释器快约 7–8%(几何平均),AArch64 的 macOS 上快约 11–12%。但注意:它仍然是实验性的,需要专门的构建并手动开启,日常脚本基本感知不到,先当"未来可期"。

顺带两个底层利好:帧指针默认开启(PEP 831),用 perf 等系统工具分析 Python 进程更准了;macOS 官方安装包默认带 free-threading(无 GIL)支持,扩展作者以后可以用稳定的 abi3t 少打几个包。

该不该升?看这张表

你的情况建议
写脚本玩、想尝鲜新特性升:官网下安装包或 pyenv install 3.15.0,用 venv 隔离
生产环境的定时任务、服务先等等:生态适配需要时间,先在测试环境跑一遍
Windows 上天天处理中文文本值得升,但先检查老代码里没写 encoding 的 open
依赖一堆老第三方库查兼容性再动,别在生产机上直接覆盖升级

尝鲜三步:1)装 3.15;2)python3.15 -m venv try315 建隔离环境;3)把常用脚本和测试跑一遍。macOS 27.0 用户注意:IDLE / tkinter 弹窗可能卡死的问题官方已知,遇到先别慌。

相关阅读

本文新特性细节核对自 What's New in Python 3.15,发布动态参考了 linuxiac 的 3.15 发布报道 与 hwbusters 的懒导入 / JIT 详解。