
先说背景:这篇讲什么
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 详解。
