Python 3.11 stable今天发布了,作为一个流行的脚本语言带来相当大的更新。

Python 3.11是非常令人兴奋的是,它的众多的性能改进。相比于更快的CPython项目,Python 3.11在性能方面看起来要好得多。

理论上Python 3.11可以比Python 3.10快10~60%。Pyston和pyy在某些领域仍然有一些优势,但CPython至少比以前的版本做得更好。

Python 3.11还添加了对带有异步I/O的任务组、异常组和except*、细化回溯中错误位置、支持在标准库中解析TOML、各种类型更改以及各种其他工作的支持。

更多错误回溯信息

Python通常被认为是一种很好的初学者编程语言,它具有可读的语法和强大的数据结构。

但是所有人都面临的一个挑战,尤其是那些刚接触 Python 的人,如何解决Python显示的错误时回溯。

在Python 3.10中,Python 的错误信息得到了极大的改进。同样,Python 3.11最受期待的功能之一也将提升您的开发者体验。

装饰性注释被添加到回溯中,可以帮助您更快地解决错误。要查看增强回溯的错误消息示例。请运行

# inverse.py

def inverse(number):
    return 1 / number

print(inverse(0))
inverse.py

更快的代码执行

Python以慢速著称的语言。例如,Python的循环比C中的类似循环慢几个数量级。这个缺点可以通过多种方式解决。但是,程序员的生产力比代码执行时间更重要。

Python 也有非常好的扩展能力使用其它语言编写的库。例如,在NumPy中完成的计算比在Python中完成的类似计算要快得多。

NumPy与Python简单性,易用性相匹配,这使 Python 成为数据科学领域的有力竞争者。

尽管如此,还是有人推动Python 性能语言盖上。在 2020 年秋季,Mark Shannon 提出了一些可以在 Python 中实现的性能改进。

提案被称为香农计划,雄心勃勃,希望在未来多个版本中使 Python 速度提高五倍。

微软已经加入,目前正在支持开发人员,包括 Mark Shannon 和 Python 的创建者 Guido van Rossum,致力于更快的 CPython项目。

正如现在所知。Python 3.11 基于 Faster CPython 项目有很多改进。在本节中,您将了解自适应解释器

PEP 659描述了一种专门的自适应解释器。主要思想是通过优化经常执行的操作来加快代码运行速度。

这类似于即时(JIT) 编译,只是它不影响编译。相反,Python的字节码是动态调整或更改的。

字节码生成中添加了一个称为加速的新步骤。这需要可以在运行时优化的指令,并用自适应指令替换它们。

每条这样的指令都会着重于它的使用方式,并可能相应地优化化自己。一旦函数被调用了一定次数,加速就会启动。

在CPython 3.11中,这发生在八次调用之后。您可以调用dis()和设置adaptive参数来观察解释器如何适应字节码。

import dis
def feet_to_meters(feet):
    return 0.3048 * feet
dis.dis(feet_to_meters, adaptive=True)
>>> feet_to_meters(8.8)
2.68224

>>> dis.dis(feet_to_meters, adaptive=True)
  1           0 RESUME_QUICK                 0

  2           2 LOAD_CONST__LOAD_FAST        1 (0.3048)
              4 LOAD_FAST                    0 (feet)
              6 BINARY_OP_MULTIPLY_FLOAT     5 (*)
             10 RETURN_VALUE

更好的异步任务语法

Python 中对异步编程的支持已经发展了很长时间。Python 2 时代添加了生成器,奠定了基础。

asyncio库最初是在 Python 3.4 中添加的,asyncandawait关键词在 Python 3.5 中添加。

在之后的版本中继续开发,为Python的异步功能添加了许多小的改进。在Python 3.11 中,您可以使用任务组,它为运行和监视异步任务提供了更简洁的语法。

asyncio库是 Python 标准库的一部分。然而,这并不是使异步工作的唯一方式。有几个流行的第三方库提供相同的功能。包括TrioCuriouvloopAnyIOQuattro

运行多个异步任务的传统方法是使用create_task()创建任务,然后使用调用gather(),这但使用起来有点麻烦。

为了更好组织异步任务,Curio引入了任务组,而Trio引入了Nurseries作为替代方案。新的asyncio任务组深受这些启发。

tasks = [asyncio.create_task(run_some_task(param)) for param in params]
await asyncio.gather(*tasks)
之前
async with asyncio.TaskGroup() as tg:
    for param in params:
        tg.create_task(run_some_task(param))
之后

支持 TOML 配置解析

TOML 是Tom's Obvious Minimal Language 的缩写。这是一种在过去十年中流行起来的配置文件格式。

Python 社区已将TOML作为首选格式。在为包和项目指定元数据。

TOML具有有好的阅读格式和易于计算机的解析。虽然 TOML 已被许多不同的工具使用多年,

但 Python 并没有内置的 TOML 支持。这在 Python 3.11 中发生了变化,tomllib被添加到标准库时。

这个新模块建立在流行tomli的第三方库之上,允许您解析TOML文件。

import tomllib
with open("units.toml", mode="rb") as file:
    units = tomllib.load(file)

units

如果你想马上试用Python 3.11,现在开始在你的Linux安装Python 3.11。