Python 3.15.0rc2已经挂上官网,正式版定在2026年10月1日发布。按照Python开发周期的惯例,第一个Beta版之后功能列表就完全冻结,现在核心团队的工作只剩修Bug。也就是说,你在官方文档里看到的内容,就是10月1日最终交付的样子。
这次更新没有3.14移除GIL那种爆炸性 headline,但工程师能用的实打实的改进密度极高。启动优化、性能分析、类型系统、C API四条线同时推进。下面按优先级拆开看。
lazy import:一个关键字解决启动慢
大Python应用的启动时间一直是个老大难。模块导入时,解释器要定位文件、从磁盘读取、编译成字节码、执行顶层代码。依赖树一深,这个过程动辄几秒,哪怕某次运行只用到其中一小部分模块。
开发者过去的解法很土:把import塞进函数内部,或者用importlib做按需加载。能跑,但代码可读性稀碎,import语句散落各处。
PEP 810给出的方案是一个新的软关键字:
“`python
lazy import json
lazy from pathlib import Path
print(“Starting up…”) # json和pathlib都还没加载
data = json.loads(‘{“key”: “value”}’) # json在这里才加载
p = Path(“.”) # pathlib在这里才加载
“`
模块顶部的import保持原样,加载成本只在真正用到的名字上结算。加载失败时,异常在首次访问的位置抛出,traceback同时包含访问点和原始import语句,调试不抓瞎。
不想改源码也有全局开关:命令行的`-X lazy_imports`和环境变量`PYTHON_LAZY_IMPORTS`都接受`all`或`normal`两个值。更细的粒度交给`sys.set_lazy_imports_filter()`,传一个回调函数,只让自家应用模块走lazy路径,第三方依赖保持立即加载。CI流水线里的短命脚本、命令行工具这类启动敏感场景,收益最大。
限制也要讲清楚:lazy只能用在模块作用域,塞进函数体、类体或try/except块直接SyntaxError。星号导入和future import同样不允许lazy。
Tachyon:零开销采样分析器,最高100万赫兹
PEP 799带来的采样分析器Tachyon,工作方式对函数调用做插桩的传统profiler完全不同:它直接抓运行中进程的堆栈跟踪。官方文档的原话是”几乎没有任何开销,同时还能实现高达1,000,000 Hz的采样率”。
每秒一百万次采样,意味着可以用在生产环境上做性能诊断,不用再为了一次profiling专门搭一套测试环境。配套的PEP 831把帧指针(frame pointers)默认打开,系统级可观测性跟上来,perf、eBPF这类外部工具抓Python栈信息更顺手。
以后排查线上慢接口,思路可以变一变:先上Tachyon高频采样定位热点函数,再决定要不要上cProfile细查。诊断成本降了一个量级。
frozendict与sentinel:内置类型补齐两块拼图
PEP 814新增内置类型`frozendict`。创建之后不允许修改,直接继承自object,并非dict的子类。键值都可哈希时,frozendict本身可哈希,能直接放进set或充当字典的key:
“`python
a = frozendict(x=1, y=2)
b = frozendict(y=2, x=1)
hash(a) == hash(b) # True
a == b # True,比较不看插入顺序
“`
配置常量、缓存key、默认参数这些怕被意外修改的场景,总算有了官方答案。标准库的json、pickle、copy、pprint等一批模块已经适配。老代码用`isinstance(arg, dict)`做检查的地方,记得改成`isinstance(arg, (dict, frozendict))`,或者更通用的`collections.abc.Mapping`。
PEP 661的`sentinel`类型解决另一个经典尴尬:函数默认参数用`None`当哨兵值,可`None`本身又是合法传参时就没法区分”没传”和”传了None”。现在有了标准答案。
JIT提速8%到13%,自由线程拿到稳定ABI
3.14的实验性JIT在3.15里大改。团队报告的数据:x86-64 Linux上CPython平均性能比纯解释器高8%到9%,macOS上高12%到13%。代价依然存在,部分代码可能慢15%,官方口径仍是”正式数据以10月1日发布为准”。
自由线程版本(free-threaded,即无GIL构建)这次拿到PEP 803/820/793定义的稳定ABI。C扩展可以一次编译,同时服务普通构建和自由线程构建,扩展维护者不必再为每个小版本单独出一套wheel。3.14那个被曝内存泄漏、已在3.14.5里移除的增量式垃圾回收器,官方表态可能走正常PEP流程在3.16重新引入,3.15保持观望。
其他值得记下的点
- UTF-8成为默认文本编码(PEP 686),Windows平台读写文件的行为变化最大,显式写encoding仍是好习惯。
- 推导式里可以直接解包(PEP 798):`[*a for a in pairs]`这种写法合法了。
- 新增`siteconfig.py`包启动配置文件(PEP 829),环境级默认配置有了落点。
- 类型系统三连:TypedDict支持带类型的额外项(PEP 728)、TypeForm注解类型表达(PEP 747)、不相交基类约束(PEP 800)。
- Windows 64位官方二进制换用尾调用解释器,错误提示继续加细,REPL颜色更多。
升级建议:10月再动手也来得及
时间点卡在10月1日,节奏建议这样安排:9月用rc2在CI里加一条3.15兼容性流水线,重点跑依赖C扩展的项目,验证ABI兼容。10月1日之后等第一个patch版本(通常几周内出)再上生产,避开rc到final之间的尾部Bug。
存量代码检查两处:一是有没有`isinstance(x, dict)`这类严格类型判断,二是有没有依赖隐式locale编码的文件操作。改动不大,排查成本低。
Python这门语言的进化节奏已经稳定在每年一版。3.13的JIT实验、3.14的自由线程、3.15的lazy import和百万赫兹采样器,三步走下来,启动慢、调试难、并发受限三个老毛病各挨了一刀。10月1日,记得升级。
(数据来源:Python官方文档What’s New in Python 3.15、Python 3.15.0rc2发布公告)
苏公网安备32010502011527号
发表回复