赞
踩
Python编程语言每年都会发布新版本,上半年发布了一个功能锁定的beta版本,年底将发布最终版本。Python 3.11的功能集刚刚定稿,有一个测试版可供测试。开发人员被鼓励在非生产代码上试用此最新版本,以验证它是否与您的程序不相冲突,并了解您的代码是否会从其性能增强中受益。
下面是Python 3.11中最重要的新特性的概述,以及它们对Python开发人员的意义。
Python 3.11中有许多单独的性能改进,但最大的一个增加是专门的自适应解释器。由于对象的类型很少更改,解释器现在尝试分析运行的代码,并用特定类型的字节码替换常规字节码。例如,二进制操作(加法、减法等)可以替换为整数、浮点和字符串的专用版本。
在Python 3.11中,Python函数调用也需要较少的开销。函数调用的堆栈帧现在使用的内存更少,设计效率更高。此外,虽然递归调用没有进行尾部优化(无论如何,这在Python中可能是不可能的),但它们比以前的版本更高效。Python解释器本身的启动速度也更快,Python运行时所需的核心模块的存储和加载效率也更高。
根据官方的Python基准测试套件,Python 3.11的运行速度大约是3.10版的1.25倍。请注意,这个加速是一个总体衡量标准:有些东西要快得多,但其他许多东西只是略快或大致相同。尽管如此,这些改进最好的部分是免费的。您无需对Python程序进行任何代码更改即可利用3.11的加速。
3.11中另一个非常有用的特性是更详细的错误消息。由于解释器中使用了新的解析器,Python 3.10已经有了更好的错误报告。现在,Python 3.11对此进行了扩展,提供了关于给定表达式的哪个特定部分导致错误的详细反馈。
思考以下引发错误的代码:
- x = [1,2,3]
- z = x[1][0]
在Python 3.10中,我们会收到以下错误消息,这不是很有帮助:
- File "C:\Python311\code.py", line 2, in <module>
- z = x[1][0]
- TypeError: 'int' object is not subscriptable
与其让我们弄清楚哪个int是不可编译的代码,Python 3.11中的错误跟踪指向生成错误的行的确切部分:
- File "C:\Python311\code.py", line 2, in <module>
- z = x[1][0]
- ~~~~^^^
- TypeError: 'int' object is not subscriptable
现在,问题的出处就十分明确了。
Python的错误处理机制在Python 3.11中获得了许多新特性:
1、使用新的except*语法和新的ExceptionGroup异常类型可以处理多异常问题。这允许优雅地处理可能同时引发多个错误的问题,例如在处理异步或并发方法时,或者在重试操作时处理多个故障时。
2、“零成本”异常:除非实际抛出异常,否则现在对程序没有内存消耗。这意味着try/except块的默认路径更快,并且使用更少的内存。
3、捕获异常所需的时间减少了约10%。
4、异常可以通过上下文注释来完善,使得异常与代码块分离。
Python的类型提示特性使更大的代码库更易于管理和分析,并且自Python 3.5以来,随着每次修订类型提示的性能都有显著增加。Python 3.11引入了几个新的类型提示。
类方法返回自身类型之前需要迟钝且详细的声明才会生效。类型.Self的模式让你声明类方法的返回值更为简便。您可以从这些方法的分析工具中获得有用且可预测的结果。
以前,类型注释无法定义给定变量必须是字符串文字,即源代码中定义的字符串。新类型。LiteralString注释修复了这一问题。使用新注释,linters可以测试变量是源中定义的字符串还是仅由源定义的字符串组成的新字符串。
自Python 3.7以来,数据类使得定义类变得更加容易,这些类遵循基于初始化参数创建属性的常见模式。但没有标准机制允许行为类似于数据类(但不是数据类本身)的东西使用类型注释来声明其行为。数据类转换添加了 类型.dataclass_transform修饰符去提示编译器一个给定的函数、类或元类的行为像一个数据类。
最初的泛型建议包括TypeVar,这是一种使用单个参数化类型指定泛型函数的方法,例如,类型T可以是int或float。Python 3.11添加了TypeVarTuple,或“可变泛型”,您可以使用它来指定占位符,不仅仅是一种类型,而是一系列类型,表示为元组。这在像NumPy这样的库中尤其有用,在这些库中,您可以提前检查错误,例如提供的数组的形状是否正确。
Python使用TOML或Tom显式的简约语言作为配置格式(如pyproject.TOML),但没有将读取TOML格式文件的能力公开为标准库模块。Python 3.11添加了tomllib来解决这个问题。注意,tomllib不创建或写入TOML文件;为此,您需要像Tomli-W或TOML Kit这样的第三方模块。
Python的re模块用于处理正则表达式,它缺少正则表达式的其他实现中的一些特性。一种是原子分组,在其他语言中得到广泛支持。Python 3.11现在使用原子分组的通用语法支持此模式(例如,(?>…)。
re模块的模式匹配引擎也被重写了一些,运行速度快了大约10%。
PEP 594启动了一项从Python标准库中移除许多所谓的坏死的电池或过时或未维护的模块的工作。从Python 3.11开始,这些库被标记为已弃用,但尚未删除;它们将在Python 3.13中完全删除。
Python 3.11中还有许多更小的改进:
1、Python对象需要更少的内存,因为它们的名称空间现在是延迟创建的,它们的名称空间字典现在尽可能共享键。
2、所有键都是Unicode的字典不再需要存储哈希,因此减少了字典的大小并允许更高的缓存效率。
3、Python运行时使用的是Python的解释器,现在可以实验性地支持编译到WebAssembly。这可能有助于PyScript等项目的未来开发,PyScript允许WASM编译的Python运行时在浏览器中运行。
参考文章:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。