Python 3.14.0 稳定版将于 2025 年 10 月正式发布,目前已进入 beta 测试阶段。这意味着在往后的几个月里,3.14 的新功能已冻结,不再合入新功能(除了修复问题和完善文档)。

3.14 正好是圈周率 π 的前几位,所以我们将要迎来的其实是一个“圆满”的版本

本文想梳理这个版本中一些值得关注的新特性,让我们先睹为快吧~

重点更新

1. 类型提示惰性求值 (PEP 649)

Python 3.14 对类型提示机制做了根本性改进。从这个版本开始,函数、类和模块上的类型提示不再立即计算,而是先存储起来,等真正需要时才进行求值。

这个特性解决了大型项目中一个老大难问题:大量类型提示导致的启动缓慢。对企业级应用和大型项目来说,这简直就是一个福音!

这个改进带来了几个实实在在的好处:

  • 项目启动速度大幅提升,尤其是大型代码仓
  • 引用未定义类型时不再需要加引号,代码更加简洁
  • 新增的 annotationlib 模块提供了灵活的类型提示检查方式

下面的示例直观展示了这个特性带来的好处:

# Python 3.14 - 不再需要引号,即使类型未定义
>>> from annotationlib import get_annotations, Format
>>> def new_way(arg: Undefined): # 直接使用未定义类型
... pass # Python 3.13 及之前版本需要这样写
>>> def old_way(arg: "Undefined"): # 必须加引号,否则报错
... pass # 可以用不同格式查看类型提示
>>> get_annotations(new_way, format=Format.STRING) # 字符串形式
{'arg': 'Undefined'}
>>> get_annotations(new_way, format=Format.FORWARDREF) # 前向引用对象形式
{'arg': ForwardRef('Undefined', owner=<function new_way at 0x...>)}

这项改进让 Python 的类型系统变得更加好用,尤其是在使用类型检查工具时确实很有帮助。

2. 基于尾调用的新解释器

Python 3.14 的 CPython 引入了新的解释器实现。不同于之前用大块 switch-case 的传统做法,新解释器用小型 C 函数之间的尾调用来处理字节码。

这种新的架构设计体现了 Python 团队对性能持续优化的决心,虽然效果可能没一开始宣传的那么震撼。

关于性能数据,这里有个有趣的小插曲:

  • 这个特性最早被官宣时,声称有 9-15% 的性能提升
  • 但后来发现数据受到了 LLVM/Clang 19 编译器一个回归问题的影响
  • 经过更严格的测试,实际数据显示:在标准 pyperformance 测试中,平均提升仅有 3-5%
  • 不过在特定的字节码密集型计算中,性能提升仍然可以达到 30%

这项改进的真正价值可能不在当下。从长远来看,这很可能是 Python 解释器架构的一次重要转型,为未来更大幅度的性能提升打下基础。

目前这个解释器只支持 Clang 19 及以上版本编译器,而且只能在 x86-64 和 AArch64 架构上跑。不过官方表示未来 GCC 也会支持。要使用这个功能,需要在编译 Python 时手动指定 --with-tail-call-interp 参数。1

3. 无侵入调试接口 (PEP 768)

Python 3.14 新增的安全外部调试接口是个很给力的新功能,大大改善了 Python 程序的调试体验。以后不用预先在代码中插入任何调试语句,也能连上已经运行中的 Python 进程。

使用起来很简单:

python -m pdb -p 1234  # 直接连接到PID为1234的Python进程

实现这个功能的技术原理很巧妙:

  1. CPython 把关键内部结构的偏移量保存在 _Py_DebugOffsets 中,调试工具可以直接访问
  2. PyThreadState 中新加了外部调试支持结构,可以注入调试脚本
  3. 通过 sys.remote_exec() 功能可以检查和控制运行中的进程

这个特性不仅改善了开发者的调试体验,还为专业调试工具(如 pyspy、py-spy 等)提供了标准接口。这些工具以前必须为每个 Python 版本单独维护内存结构偏移量,现在不用这么麻烦了。生产环境下排查问题的难度也大大降低!

附:Python 3.14 调试特性的深度解读

4. 模板字符串 (PEP 750)

Python 3.14 新增了一种特别的字符串写法——模板字符串(t-string)。就像常用的 f-string 前面加 f 一样,这种新字符串前面加 t

它主要解决了 Web 开发中的安全需求。在用 Django、Flask 这类框架开发网站时,如何安全地处理 HTML 内容和 SQL 语句一直是个老大难问题。这个新的 t-string 语法就是为了解决这个问题,它兼顾了代码的简洁性和内容的安全性。

简单的例子:

from string.templatelib import Template

name = "World"
template = t"Hello {name}" # 返回一个 Template 对象,而不是字符串

t-string 与 f-string 最大的区别在于:f-string 会直接计算并返回字符串,而 t-string 生成的是 Template 类型的对象。有了这个对象,我们就能对模板内容做各种安全处理,比如 HTML 转义和 SQL 注入防护:

from string.templatelib import Template, html

# 有恶意代码
evil = "<script>alert('evil')</script>" # 用模板处理,防止 XSS 攻击
template = t"<p>{evil}</p>" # 使用 html() 函数转义危险字符
html_safe = html(template)
assert html_safe == "<p>&lt;script&gt;alert('evil')&lt;/script&gt;</p>"

这个新功能会让 Web 开发、日志记录、数据库操作等场景更加安全和方便。

附:Python 3.14 t-string 的全面解析与使用教程

其它重要更新

1. 支持 Zstandard 压缩格式 (PEP 784)

Python 3.14 标准库新增了 compression.zstd 模块,正式把 Zstandard 压缩格式纳入标准支持。这种由 Meta 公司开发的格式既压得小又压得快,甚至超过很多老牌压缩算法,非常适合处理大数据和网络通信场景。

随之一起更新的还有 tarfilezipfileshutil 模块,现在都能直接处理 Zstandard 压缩包了。而原有的 lzmabz2 等压缩模块也被整合到新的 compression 包下,统一了访问方式。

2. 用于 C 扩展的 Python 配置 API (PEP 741)

Python 3.14 新加了 C 语言的配置 API,写 C 扩展时操作 Python 配置变得简单多了。用这个 API 提供的函数,我们可以很方便地查询或改变 Python 的运行时配置。

比如,以前写 C 扩展必须深入了解 CPython 内部构造,现在只需用几行简单代码就能操作内存分配器、日志设置等:

// 看看调试模式是否开启
int debug_enabled = _PyConfig_GetBool(config, "debug"); // 指定模块搜索路径
_PyConfig_SetString(config, "pythonpath", "/custom/path");

博客原文

3. 实验性 JIT 编译器 (PEP 744)

Python 3.14 正式在官方 macOS 和 Windows 二进制版本中加入了实验性的即时编译器(JIT)。不推荐用于生产环境,仅供测试和尝鲜。

启用方式简单,只需设置环境变量:

# 设置环境变量开启 JIT
PYTHON_JIT=1 python3.14 your_script.py

可以通过 sys._jit 模块检查 JIT 状态:

import sys

if hasattr(sys, "_jit"):
print(f"JIT状态: {"启用" if sys._jit.is_enabled() else "未启用"}")
else:
print("JIT不支持")

4. REPL 语法高亮

Python 3.14 的交互式环境(REPL)正式支持语法高亮,大大提升了开发体验。这个功能默认开启,除非你设置了 PYTHON_BASIC_REPL 环境变量。

默认主题使用标准的 ANSI 颜色代码,确保兼容性的同时提供了清晰的视觉区分度,另外也支持自定义颜色主题。

这一改进让原生 Python 接近了 IPython 和 Jupyter 等现代工具的用户体验,也表明官方在重视开发者日常使用的小细节。

5. 放弃 PGP 签名 (PEP 761)

Python 3.14 版本将告别 PGP 签名,改用更现代的签名和验证方式来发布官方软件包。这一改变其实是 Python 跟上了开源软件分发领域的潮流,和当下大多数主流项目的做法一致。

6. finally 块中不能再用跳转语句 (PEP 765)

Python 3.14 增加了一项新限制:不能在 finally 块里用 returnbreakcontinue 跳出去。这种写法以后会被视为语法错误。

这个限制有很实在的目的,因为 finally 中的跳转语句通常会导致代码难懂、难维护,容易把异常情况给吞掉,造成莫名其妙的问题。

# Python 3.13 允许这种危险写法,但异常会被吞
try:
raise ValueError("重要错误")
except Exception as e:
print(f"捕获到错误: {e}")
raise
finally:
# 这里写 return 会打断异常传递,调用方看不到原始错误
return "似乎一切正常" # Python 3.14 中,上述代码将在语法层面被禁止

7. 捕获多个异常时不用加括号了 (PEP 758)

Python 3.14 简化了异常处理的写法。以前想同时捕获多种异常类型必须加括号,而在 3.14 版本中可以直接用逗号分隔:

try:
operation()
except ValueError, TypeError: # 可以用逗号分隔多个异常类型
print("处理值错误或类型错误") # 对异常组也适用同样的语法
try:
operation()
except* ValueError, TypeError: # 异常组也可以用逗号分隔
print("处理值错误或类型错误")

这种写法不仅更简洁,也将更符合直觉。

不兼容变更

Python 3.14 带来了一些重要的不兼容变更,升级时需要特别注意:

  1. 除了 macOS 和 Windows 外,其它平台上 multiprocessingProcessPoolExecutor 的默认启动方式从 fork 改成了 forkserver。这能避免一些多线程的问题,但可能要修改依赖于旧行为的代码。

  2. CPython 解释器优化了引用计数机制,去掉了一些不必要的计数更新,所以 sys.getrefcount()Py_REFCNT() 返回的数字可能和以前不一样了。

  3. PEP 738 修改了 async/await 关键字的解析规则,一些极端情况下可能造成不兼容。

  4. distutils 模块在 3.12 中已经被强烈警告,3.14 版本会完全移除。如果还在使用,应该迁移到 setuptoolssysconfig

  5. imp 模块所有标记为弃用的函数已经删除,应改用 importlib

  6. asyncio 模块中的一些废弃函数如 @coroutine 装饰器已被移除,应该用 async/await 语法替代。

  7. XML 模块默认开启了更严格的安全限制,可能会导致原有较宽松的解析器设置失效。

  8. SSL/TLS 模块默认禁用了某些过时的加密算法和协议版本,对于需要与旧系统通信的应用可能要额外配置。

总结

这个带着圆周率数字的 Python 3.14 版本,给我们带来了全方位的升级。

在性能上,类型提示的惰性求值和全新的尾调用解释器大幅减轻了启动负担,而实验性的 JIT 编译器则在特定场景下展现了可观的速度提升。

在开发体验上,无侵入调试接口的加入和 REPL 的语法高亮功能使日常编程变得更加舒心逸意。

模板字符串和 Zstandard 压缩的加入则扩展了 Python 在 Web 开发和数据处理领域的应用空间。

除了功能增强,3.14 也带来了一系列语法优化,如异常捕获时不再需要括号以及 finally 块中禁用跳转语句等。这些简化和限制看似微小,却能减少代码中的隐藏 bug。同时,这个版本还作出了一些前瞻性的决定,如放弃 PGP 签名和改用 forkserver 作为默认启动方式。

总的来说,这个圆周率版本在性能、开发体验和语言功能上都有实质性的改进。不管是类型提示、解释器改进还是模板字符串,都展示了 Python 在各个领域的持续发力和进步。

参考资料

What's new in Python 3.14

Python 3.14 新特性解析

Python 3.14 新特性盘点,更新了些什么?的更多相关文章

  1. Python 3.9 新特性速览

    国庆假期,Python 社区发布了 3.9 版本的第一个 stable release. 相比于 3.8,Python 3.9 新特性众多,但不少特性与大多数 Python"使用者" ...

  2. Python 3.8 新特性来袭

    Python 3.8 新特性来袭 Python 3.8是Python语言的最新版本,它适合用于编写脚本.自动化以及机器学习和Web开发等各种任务.现在Python 3.8已经进入官方的beta阶段,这 ...

  3. Python 3 初探,第 1 部分: Python 3 的新特性

    Python 3 是 Guido van Rossum 功能强大的通用编程语言的最新版本.它虽然打破了与 2.x 版本的向后兼容性,但却清理了某些语法方面的问题.本文是系列文章中的第一篇,介绍了影响该 ...

  4. C++ 14 新特性总结

    转载自: http://www.codeceo.com/article/cpp-14-new-features.html C++14 这一继C++11 之后的新的 C++ 标准已经被正式批准,正在向 ...

  5. Python 3.9 新特性:任意表达式可作为装饰器!

    一个月前(2月20日),一则新的 PEP 没有受到任何阻碍就被官方采纳了,这么快的速度,似乎并不多见. 然而,更为高效率的是,仅在半个月内,它的实现就被合入了代码仓.也就是说,我们最快有望在 3 天后 ...

  6. Python - 3.8 新特性之仅位置参数 & 仅关键字参数

    前置知识 Python 函数:https://www.cnblogs.com/poloyy/p/15092393.html 什么是仅限位置形参 仅限位置形参是 Python 3.8 才有的新特性 新增 ...

  7. php新特性--持续更新

    命名空间 在其他语言中不算新鲜事,但php是5.3.0中引入,具体定义就不复述了,其主要作用是 封装和组织相关php类 .命名空间被引入之前php主要是通过Zend方式组织代码,这种方式带来的问题是类 ...

  8. Kali Liunx 2.0震撼来袭(附下载地址、新特性和更新日志)

    Kali 2.0昨天已经在BlackHat 2015 USA上正式发布了.无论是粉丝们还是Kali官方都对这个2.0版本抱有极大的期待和热情.这是第一个基于Debian Jessie的Kali版本,此 ...

  9. python 3.7 新特性 - popitem

    百度上大多文章说 popitem  随机删除字典的一个键值对 python 3.7 官方文档已经说了,popitem 删除字典最后一个添加进去的键值对

  10. python 3.8 新特性

    董伟明技术博客 安装 python 3.8 环境 , 在此刻 似乎 anaconda 都还不支持 3.8 ,所以直接下载源码进行编译安装 环境: centos7.5 版本:python3.8 1.依赖 ...

随机推荐

  1. Linux - 关于yum源 file & ftp & http 的三种配置方式

    一.环境准备 1.两台Centos服务器:node1.node2 2.配置ip:node1(192.168.2.111).node2(192.168.2.112) 3.关闭防火墙 systemctl ...

  2. mybatis - [09] 动态SQL

    题记部分 一.if & test 如果id,name,age不为空,则按照指定的值进行查询.如果这三者都是空(null和空字符串),则该sql执行结果为全表查询的结果集. <select ...

  3. IDEA - 文件上方的文档注释如何自定义

    1.在设置中打开文件和代码模板,根据描述中的参考信息进行自定义配置 File > Settings > Editor > File and Code Templates 2.配置完成 ...

  4. mysql 无数据插入,有数据更新

    mysql的语法与sql server有很多不同,sql server执行插入更新时可以update后使用if判断返回的@@rowcount值,然后确定是否插入,mysql在语句中无法使用类似sql  ...

  5. 异步导入导出Excel方案

    一.异步导出Excel文件 1.设计思想 用户无需在当前页面等待导出结果,点击导出按钮后服务端即可返回前端提示用户导出处理中请到下载中心查看结果. 具体业务文件导出实现由后台异步处理导出文件到腾讯CO ...

  6. 洛谷P11380 [GESP202412 八级] 排队 题解

    数据太可恶了,竟然有重边!!! 题目传送门. 显然一道简单图论题. 把 \(a_i\) 和 \(b_i\) 的关系想象成一条有向边,于是可以得出:如果 \(x\) 的出度大于 \(1\) 或者 \(x ...

  7. sql---一条sql查询语句是如何查询的、更新的

    mysql分为server层和层存储引擎层 类型:InnoDB.MyISAM 查询过程 连接器:与客户端建立连接.获得权限.维持和管理命令 查询缓存:弊大于利,在8.0之后已去除 分析器:对sql语法 ...

  8. C# USB 摄像头 OpenCV 视频picBox呈现,抓拍图像保存呈现。

    1.winform 应用程序,两个picturebox空间,一个用于视频呈现,一个用于抓拍呈现. 2.引用包OpenCvSharp4.OpenCvSharp4.Extensions.OpenCvSha ...

  9. 添加xxx.so到环境变量里

    点击查看代码 libxxx.so 文件位于 /usr/local/lib 目录下,你可以按照以下步骤操作: 创建配置文件: echo "/usr/local/lib" | sudo ...

  10. React从webpack迁移到rsbuild 纪实

    Why 随着团队项目规模越来越大之后,继从babel-loader迁移到esbuild之后发现打包.热重载性能随着时间迭代之后又慢慢开始成为性能瓶颈,所以决定用新的打包工具去解决这个问题.esbuil ...