Python 3.15 是 Python 编程语言的一个特性发布版本系列。其首个正式稳定版 Python 3.15.0 于 2026 年 10 月 9 日发布,接替了 Python 3.14。该版本引入了新的语言句法与内置类型,更改了默认的文本编码行为,重构了性能分析工具,并扩展了对自由线程 CPython 构建中原生扩展的支持。(python.org)
发布历史与维护周期
Python 3.15 遵循 Python 的年度特性发布周期。其开发始于 2025 年 5 月 7 日,首个 alpha 版本于 2025 年 10 月 14 日发布。2026 年 5 月 7 日发布的首个 beta 版本标志着特性冻结。在最终稳定版发布前,共推出了三个候选发布版(RC)。这些阶段确保了所有变更在正式版本发布前得到充分测试。(peps.python.org)
PEP 790 规定了大约两年的常规错误修复更新期(通常每两个月发布一次),随后是大约三年的仅安全更新维护期。安全支持预计将持续到 2031 年 10 月左右;仅安全维护阶段的发布预计仅提供源代码。这些日期代表了计划的维护生命周期,并不保证每次更新都会在特定日期准时发生。(peps.python.org)
显式惰性导入
PEP 810 通过引入软关键字 lazy,实现了对导入模块的显式惰性加载。惰性导入会创建一个延迟绑定;模块仅在首次使用该绑定时才会被导入,而非在 import 语句执行时立即加载。除非通过显式机制启用惰性加载,否则普通导入仍保持其即时加载行为。(peps.python.org)
lazy import json
def decode(text):
return json.loads(text)
在此示例中,执行 import 语句本身并不会加载 json。只有在访问 json.loads 时才会触发延迟导入的解析。该特性的目的是避免为某次运行中从未用到的依赖项执行初始化工作,从而可能减少启动时间和内存消耗。(peps.python.org)
惰性导入也会改变可观察到的运行时序。导入错误会在首次使用时抛出,而模块级的副作用(例如插件注册)也会推迟到模块实际加载时才发生。因此,实际的导入顺序可能与源代码中的书写顺序不同。这一特性并不等同于“立即导入模块而仅推迟访问其属性”。(peps.python.org)
新句法仅限于模块作用域使用:它不能出现在函数体、类体或 try/except/finally 块内部。星号导入(from module import *)和 future 导入均不支持惰性导入。对于需要在句法上与旧版 Python 保持兼容的源代码,可以通过模块级的 __lazy_modules__ 声明,在 Python 3.15 中将指定的普通导入标记为惰性导入。(docs.python.org)
新增内置类型
不可变字典
PEP 814 添加了 frozendict,一种内置的不可变映射类型。它支持类似于字典的构建与查找操作,保留插入顺序,并实现了映射协议(mapping protocol),但它并不是 dict 的子类。在构建完成后,其内部项不能被添加、移除或替换。(peps.python.org)
settings = frozendict({"mode": "batch", "retries": 3})
mode = settings["mode"]
不可变性仅适用于映射自身的结构,并不会递归应用于其包含的每个对象。其对应的值仍可以是可变对象(例如列表)。仅当 frozendict 包含的所有值都可哈希时,该 frozendict 本身才是可哈希的;因此,内容合适的不可变映射可以用作字典的键、集合的元素或缓存函数的参数。这种设计将结构不可变性与深层不可变性区分开来。(peps.python.org)
哨兵值
PEP 661 添加了内置函数 sentinel,用于创建具名哨兵值:即表示特殊状态(例如参数被省略)的唯一对象。当 None 本身也是有效输入、无法明确表示“未提供参数”时,哨兵值尤为实用。(peps.python.org)
MISSING = sentinel("MISSING")
def describe(value=MISSING):
if value is MISSING:
return "No argument supplied"
return repr(value)
哨兵值通过对象标识(identity)进行区分,通常使用 is 运算符进行检查。该功能提供了可读的表示形式,并为复制、序列化和类型注解定义了明确的行为,取代了此前用于构建占位对象的多种临时做法。即使名称相同,两次独立创建的哨兵对象也互不相同。(peps.python.org)
默认启用 UTF-8 模式
PEP 686 将 UTF-8编码 模式设为 Python 3.15 的默认设置。受 UTF-8 模式控制默认编码的操作(包括未显式指定编码的文本文件操作)通常不再依赖系统的语言环境(locale)。UTF-8 是一种针对 Unicode统一码 文本的编码;这一变更涉及文本与字节之间的相互转换方式,而非修改 Python 的字符串类型本身。(peps.python.org)
该变更可能会影响那些隐式依赖旧版语言环境编码的程序。包含其他编码字节的文件不会仅仅因为解释器默认值的变更而自动变为 UTF-8。显式传入的编码参数仍然有效,使用 encoding="locale" 则可以明确请求系统的区域设置编码。可以通过命令行参数 -X utf8=0 或环境变量 PYTHONUTF8=0 禁用 UTF-8 模式。(peps.python.org)
推导式中的解包
PEP 798 扩展了 Python 的句法,允许在列表推导式、集合推导式、字典推导式以及生成器表达式的开头使用解包。其中 * 形式用于合并可迭代对象的元素,而 ** 形式用于合并映射。(peps.python.org)
groups = [[1, 2], [3], [4, 5]]
flat = [*group for group in groups]
# [1, 2, 3, 4, 5]
parts = [{"a": 1}, {"b": 2}, {"a": 3}]
combined = {**part for part in parts}
# {"a": 3, "b": 2}
在列表推导式中,解包操作会用每个可迭代对象的元素逐一扩展生成的结果列表,而不是将该可迭代对象作为单个元素追加。字典解包会依次更新结果,因此对于重复的键,后出现的键值会覆盖先前的键值。这一扩展提供了一种替代嵌套推导式或显式更新循环的简洁语法,且不会改变此前有效推导式句法的既有含义。(peps.python.org)
性能分析与解释器性能
Python 3.15 根据 PEP 799 引入了一个专用的 profiling 标准库包。该包按方法论重新组织了性能分析工具:确定性跟踪由 profiling.tracing 表示,统计采样由 profiling.sampling 表示。新版本包含了一个名为 Tachyon 的高频统计采样性能分析器。既有的 cProfile 和 pstats 接口为保持兼容性依然可用,而纯 Python 实现的 profile 模块已被弃用。(peps.python.org)
处于实验阶段的即时编译编译器也获得了大幅改进,包括新的跟踪前端、基础寄存器分配以及更广泛的优化支持。官方基准测试结果显示,在 x86-64 Linux 上,其几何平均性能比标准优化解释器提升了约 7–8%;在 AArch64 macOS 上,比优化后的尾调用解释器提升了 11–12%。这些对比针对的是特定的 JIT 与非 JIT 配置,并不代表从 Python 3.14 升级后所有程序都能普遍获得提速;单个基准测试的结果中既存在性能下降,也存在大幅提升的情况。(docs.python.org)
自由线程扩展与二进制兼容性
PEP 803 引入了 abi3t,这是一种用于自由线程 CPython 构建的稳定应用二进制接口。自由线程构建支持在没有传统全局解释器锁的情况下进行并行计算。这一新 ABI 解决了编译扩展在受支持的各自由线程解释器版本之间的分发问题。(peps.python.org)
稳定 ABI 不同于 Python 源码级的应用程序编程接口。面向该稳定 ABI 构建的扩展可以避免为每个受支持的解释器版本重新编译,但采用 abi3t 可能需要对扩展源代码进行较大幅度的修改。其不透明接口减少了对解释器内部对象布局的依赖,这些布局在不同的解释器配置之间各不相同。(peps.python.org)
新的 ABI 并不能使所有既有扩展自动兼容自由线程执行。无法采用该 ABI 的扩展可以继续为传统稳定 ABI 和特定版本的自由线程 ABI 分别提供独立构建。二进制兼容性与正确处理并发访问仍是两个彼此独立的问题。(peps.python.org)
兼容性变更
除了新增特性外,Python 3.15 还移除了此前已弃用的接口并收紧了部分校验规则。代表性变更包括:
importlib不再支持旧版加载器方法load_module()。http.server移除了CGIHTTPRequestHandler及其--cgi选项。- 抽象语法树(AST)节点的构造函数将拒绝缺失的必填字段以及未预期的关键字参数。
- 移除了旧版的
sre_compile、sre_constants和sre_parse模块。(docs.python.org)
因此,兼容性变更跨越了多个不同层面:新句法需要解析器支持,默认 UTF-8 模式可能改变对文件内容的解析方式,移除的接口会影响现有源代码,而原生扩展必须与相应的解释器 ABI 相匹配。无论应用程序是否使用该版本引入的新内置类型或惰性导入,这些变更都会产生影响。(peps.python.org)
参考来源
- Python Release Python 3.15.0python.org
- PEP 790 – Python 3.15 Release Schedulepeps.python.org
- What’s new in Python 3.15docs.python.org
- PEP 810 – Explicit lazy importspeps.python.org
- PEP 814 – Add frozendict built-in typepeps.python.org
- PEP 661 – Sentinel Valuespeps.python.org
- PEP 686 – Make UTF-8 mode defaultpeps.python.org
- PEP 798 – Unpacking in Comprehensionspeps.python.org
- PEP 799 – A dedicated profiling package for organizing Python profiling toolspeps.python.org
- PEP 803 – “abi3t”: Stable ABI for Free-Threaded Buildspeps.python.org