数据结构论坛

注册

 

发新话题 回复该主题

Python311正式版发布了 [复制链接]

1#
北京看白癜风要多少钱 https://disease.39.net/bjzkbdfyy/170805/5599614.html


  ErrorTracebacks


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


  Python3.11将Decorativeannotation添加到tracebacks中,以帮助用户更快地解释错误消息。想要获得这种功能,可以将以下代码添加到inverse.py文件中。


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


  注意嵌入在traceback中的^和~符号,它们指向导致错误的代码。与此前的tracebacks一样,你应该从底层开始,然后逐步向上。这种操作对发现错误非常有用,但如果代码过于复杂,带注释的tracebacks会更好。


  更快的代码执行


  Python以速度慢著称,例如在Python中,常规循环比C中的类似循环慢几个数量级。


  Python官方正在着手改进这一缺陷。年秋,MarkShannon提出了关于Python的几个性能改进。这个提议被称为香农计划(ShannonPlan),他们希望通过几个版本的更新将Python的速度提高5倍。不久之后微软正式加入该计划,该公司正在支持包括MarkShannon、GuidovanRossum在内的开发人员,致力于「FasterCPython」项目的研究。


  「FasterCPython」项目中的一个重要提案是PEP,在此基础上,Python3.11有了许多改进。


  PEP描述了一种「specializingadaptiveinterpreter」。主要思想是通过优化经常执行的操作来加快代码运行速度,这类似于JIT(just-in-time)编译。只是它不影响编译,相反,Python的字节码是动态调整或可更改的。


  


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


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


  在基准测试中,CPython3.11比CPython3.10平均快25%。FasterCPython项目是一个正在进行的项目,已经有几个优化计划在年10月与Python3.12一起发布。你可以在GitHub上
  项目
  更好的异步任务语法


  Python中对异步编程的支持已经发展了很长时间。Python2时代添加了生成器,asyncio库最初是在Python3.4中添加的,而async和await关键字是在Python3.5中添加的。在Python3.11中,你可以使用任务组(taskgroups),它为运行和监视异步任务提供了更简洁的语法。


  改进的类型变量


  Python是一种动态类型语言,但它通过可选的类型提示支持静态类型。Python静态类型系统的基础在年的PEP中定义。自Python3.5以来,每个Python版本都引入了几个与类型相关的新提案。


  Python3.11发布了5个与类型相关的PEP,创下新高:


  PEP:可变泛型


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


  PEP:Self类型


  PEP:任意文字字符串类型


  PEP:数据类转换


  支持TOML配置解析


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


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


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


  


  其他功能


  除了以上主要更新和改进之外,Python3.11还有更多值得探索的功能,比如更快的程序启动速度、对异常的更多改变以及对字符串格式的小幅改进。


  更快的程序启动速度


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


  


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


  


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


  


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


  


  该示例分别运行在Python3.11和3.10上,结果如下图所示,Python3.11的导入速度更快,有助于Python程序更快地启动。


  


  零成本异常


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


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


  异常组


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


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


  


  异常Notes


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


  


  负零格式化


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


  


  更多关于Python3.11的更新细节请参阅原文档。


  原文:

分享 转发
TOP
发新话题 回复该主题