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))
更快的代码执行
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 中添加的,async
andawait
关键词在 Python 3.5 中添加。
在之后的版本中继续开发,为Python的异步功能添加了许多小的改进。在Python 3.11 中,您可以使用任务组,它为运行和监视异步任务提供了更简洁的语法。
asyncio
库是 Python 标准库的一部分。然而,这并不是使异步工作的唯一方式。有几个流行的第三方库提供相同的功能。包括Trio和Curio,uvloop、AnyIO和Quattro。
运行多个异步任务的传统方法是使用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。