前言
根据官方资料显示,最新发布的 Python 3.11 比 Python 3.10 快 10-60%,对用户更友好。这一版本历经 17 个月的开发,现在公开可用。Python 3.11 的具体改进主要表现在:更详实的 Error Tracebacks、更快的代码执行、更好的异步任务语法、改进类型变量、支持 TOML 配置解析以及一些其他非常酷的功能(包括快速启动、Zero-Cost 异常处理、异常组等)。
Python 指导委员会成员和核心开发者、Python 3.10/3.11 发布管理者 Pablo Galindo Salgado 表示,为了使 3.11 成为最好的 Python 版本,我们付出了很多努力。
Python 3.11 新特性
Error Tracebacks
Python 这门编程语言对初学者非常友好,它具有易于理解的语法和强大的数据结构。但对于刚刚接触 Python 的人来说却存在一个难题,即如何解释当 Python 遇到错误时显示的 traceback。
Python 3.11 将 Decorative annotation 添加到 tracebacks 中,以帮助用户更快地解释错误消息。想要获得这种功能,可以将以下代码添加到 inverse.py 文件中。
def inverse(x):
return 1 / x
print(inverse(0))
举例来说,你可以使用 inverse() 来计算一个数的倒数。因为 0 没有倒数,所以在运行下列代码时会抛出一个错误。
在 Python 3.11 中,Traceback 会显示更清晰的指向符号(如 ^ 和 ~),它们直接指向导致错误的代码行。与此前的 tracebacks 一样,你应该从底层开始,然后逐步向上。这种操作对发现错误非常有用,但如果代码过于复杂,带注释的 tracebacks 会更好。
更快的代码执行
Python 以速度慢著称,例如在 Python 中,常规循环比 C 中的类似循环慢几个数量级。
Python 官方正在着手改进这一缺陷。2020 年秋,Mark Shannon 提出了关于 Python 的几个性能改进。这个提议被称为香农计划 (Shannon Plan),他们希望通过几个版本的更新将 Python 的速度提高 5 倍。不久之后微软正式加入该计划,该公司正在支持包括 Mark Shannon、Guido van Rossum 在内的开发人员,致力于「Faster CPython」项目的研究。
「Faster CPython」项目中的一个重要提案是 PEP 659,在此基础上,Python 3.11 有了许多改进。
PEP 659 描述了一种「specializing adaptive interpreter」。主要思想是通过优化经常执行的操作来加快代码运行速度,这类似于 JIT(just-in-time)编译。只是它不影响编译,相反,Python 的字节码是动态调整或可更改的。
研究人员在字节码生成中添加了一个名为「quickening」的新步骤,从而可以在运行时优化指令,并将它们替换为 adaptive 指令。
一旦函数被调用了一定次数,quickening 指令就会启动。在 CPython 3.11 中,八次调用之后就会启动 quickening。你可以通过调用 dis() 并设置 adaptive 参数来观察解释器如何适应字节码。
import dis
def test_func():
x = 1 + 2
for i in range(100):
x += i
return x
test_func()
test_func()
test_func()
test_func()
test_func()
test_func()
test_func()
test_func()
dis.dis(test_func, adaptive=)


