Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

想要体验新功能的小伙伴赶紧去试试新版本吧!

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

2020 年 1 月 1 日,Python 官方结束了对 Python 2 的维护,这意味着 Python 2 已完全退休,进入了 Python 3 时代。打从进入 3 版本以来,Python 官方已经发布了众多修改分支,现在来到了最新的版本 Python 3.11。

其实研究界有个不公开的秘密,那就是 Python 运转速率并不快但容易上手,因此运用人数超级多,在众多最受欢迎语言榜单中 Python 多次位列第一。很多开发者都期待这门语言的性能有所提升,还有人畅想 Python 4 会不会在某个不经意的时刻到来,有这种想法的人可以放一放了,Python 之父 Van Rossum 都说了,Python 4.0 可能不会来了。

Van Rossum 曾表示:「我和 Python 核心开发团队的成员对 Python 4.0 没什么想法,提不起兴趣,估计至少会一直编号到 3.33。Python 的加速是渐进式的,3.11 版本会有新的速率提升,预计会比 3.10 快得多。」

正如 Van Rossum 所说,根据官方资料显示最新发布的 Python 3.11 比 Python 3.10 快 10-60%,对用户更友好。这一版本历经 17 个月的开发,现在公开可用。

Python 3.11 的具体改观主要表现在:更详实的 Error Tracebacks、更快的代码执行、更好的异步任务语法、改观范例变量、反对 TOML 配置解析以及一些其他非常酷的功能(包括快速驱动、Zero-Cost 异样处理、异样组等)。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

Python 指导委员会成员和核心开发者、Python3.10/3.11 发布管理者 Pablo Galindo Salgado 表示,为了使 3.11 成为最好的 Python 版本,我们付出了很多努力。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

Python 3.11 新特性

Error Tracebacks

Python 这门编程语言对初学者非常友好,它具有易于理解的语法和强大的数据结构。但对于刚刚接触 Python 的人来说却存在一个难题,即如何解释当 Python 遇到差错时显示的 traceback。

Python 3.11 将 Decorative annotation 增添到 tracebacks 中,以帮助用户更快地解释差错消息。想要获得这种功能,可以将以下代码增添到 inverse.py 文件中。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

举例来说,你可以运用 inverse() 来计算一个数的倒数。因为 0 没有倒数,所以在运转下列代码时会抛出一个差错。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

注意嵌入在 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 的字节码是动态调整或可更改的。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

研究人员在字节码生成中增添了一个名为「quickening」的新步骤,从而可以在运转时优化指令,并将它们替换为 adaptive 指令。

一旦函数被调用了一定次数,quickening 指令就会驱动。在 CPython 3.11 中,八次调用之后就会驱动 quickening。你可以通过调用 dis() 并设置 adaptive 参数来观察解释器如何适应字节码。

在基准测试中,CPython 3.11 比 CPython 3.10 平均快 25%。Faster CPython 项目是一个正在进行的项目,已经有几个优化计划在 2023 年 10 月与 Python 3.12 一起发布。你可以在 GitHub 上关注该项目。

项目地址:https://github.com/faster-cpython/ideas

更好的异步任务语法

Python 中对异步编程的反对已经发展了很长时间。Python 2 时代增添了生成器,asyncio 库最初是在 Python 3.4 中增添的,而 async 和 await 关键字是在 Python 3.5 中增添的。在 Python 3.11 中,你可以运用任务组(task groups),它为运转和监视异步任务提供了更简洁的语法。

改观的范例变量

Python 是一种动态范例语言,但它通过可选的范例提示反对静态范例。Python 静态范例系统的基础在 2015 年的 PEP 484 中定义。自 Python 3.5 以来,每个 Python 版本都引入了几个与范例相关的新提案。

Python 3.11 发布了 5 个与范例相关的 PEP,创下新高:

PEP 646: 可变泛型

PEP 655: 根据需要或可能丢失的情况标记单个 TypedDict 项

PEP 673: Self 范例

PEP 675: 任意文字字符串范例

PEP 681: 数据类转换

反对 TOML 配置解析

TOML 是 Tom's Obvious Minimal Language 的缩写。这是一种在过去十年中流行起来的配置文件格式。在为包和项目指定元数据时,Python 社区已将 TOML 作为首选格式。

虽然 TOML 已被运用多年,但 Python 并没有内置的 TOML 反对。当 tomllib 增添到标准库时,Python 3.11 中的情况发生了变化。这个新模块建立在 toml 第三方库之上,允许解析 TOML 文件。

以下是名为 units.toml 的 TOML 文件示例:

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

其他功能

除了以上主要更新和改观之外,Python 3.11 还有更多值得探索的功能,比如更快的次序驱动速率、对异样的更多改变以及对字符串格式的小幅改观。

更快的次序驱动速率

Faster CPython 项目的一大成果是实现了更快的驱动时间。当你运转 Python 脚本时,解释器初始化需要一些操作。这就导致即便是最简单的次序也需要几毫秒才能运转。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

在很多情况下,与运转代码所需时间相比,驱动次序需要的时间可以忽略不计。但是在运转时间较短的脚本中,如典型的命令行应用次序,驱动时间可能会显著影响次序性能。比如考虑如下脚本,它受到了经典 cowsay 次序的启发。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

在 snakesay.py 中,你从命令行读取一条消息,然后将这条消息打印在带有一条可爱蛇的对话气泡中。你可以让蛇说任何话。这是命令行应用次序的基本示例,它运转得很快,但仍需要几毫秒。这一开销的很大部分发生在 Python 导入模块时。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

你可以运用 – X importtime 选项来显示导入模块所用的时间。表中的数字为微秒为单位,最后一列是模块名称的格式。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

该示例分别运转在 Python 3.11 和 3.10 上,结果如下图所示,Python 3.11 的导入速率更快,有助于 Python 次序更快地驱动。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

零成本异样

异样的内部表示在 Python 3.11 中有所不同。异样对象更轻量级,并且异样处理发生了变化。因此只要不触发 except 字句,try … except 块中的开销就越小。

所谓的零成本异样受到了 C++ 和 Java 等其他语言的启发。当你的源代码被编译为字节码时,编译器创建跳转表,由此来实现零成本异样。如果引发异样,查询这些跳转表。如果没有异样,则 try 块中的代码没有运转时开销。

异样组

此前,你了解到了任务组以及它们如何同时处理多个差错。这都要归功于一个被称为异样组的新功能。

我们可以这样考虑异样组,它们是包装了其他几种惯例异样的惯例异样。虽然异样组在很多方面表现得像惯例异样,但它们也反对特殊语法,帮助你有效地处理每个包装异样。如下所示,你可以通过给出一个描述并列出包装的异样来创建一个异样组。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

异样 Notes

惯例异样具有增添任意 notes 的扩展能力。你可以运用. add_note() 向任何异样增添一个 note,并通过检查.__notes__属性来查看现有 notes。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

负零格式化

运用浮点数进行计算时可能会遇到一个奇怪概念——负零。你可以观察到负零和 regular zero 在 REPL 中呈现不同,如下所示。

Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本

更多关于 Python 3.11 的更新细节请参阅原文档。

原文链接:https://realpython.com/python311-new-features/

给TA打赏
共{{data.count}}人
人已打赏
AI

ECCV 2022 | 赵天成博士OmLab团队斩获ODinW开放域标的检测双料冠军等多项荣誉并受邀进行主题报告

2022-10-25 10:51:00

AI

香港中文大学薛天帆老师招收全奖博士生、硕士生 | 2023夏季

2022-10-26 16:53:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索