当前位置: 首页 > 科技观察

Python3.11正式版来了,比3.10快10-60%,官方:这可能是最好的版本

时间:2023-03-14 18:52:53 科技观察

终于,Python3.11正式版发布啦!2020年1月1日,Python正式结束对Python2的维护,这意味着Python2已经彻底退役,进入Python3时代。自进入第3版本以来,Python正式发布了很多修改分支,现在最新的来了版本,Python3.11。事实上,研究界有一个不为人知的秘密,那就是Python速度不快但使用方便,因此拥有大量的用户,并且多次在多个最热门语言榜单中排名第一。很多开发者都在期待着这门语言性能的提升,也有人怀疑Python4会不会在不经意间降临。有这种想法的人可以搁置一旁。Python之父VanRossum表示,Python4.0可能不会到来。VanRossum曾表示:“我和Python核心开发团队的成员对Python4.0没有概念,也不感兴趣。估计至少要到3.33才会有编号。Python的加速是循序渐进的,3.11版本会有新的速度提升,预计会比3.10快很多。”正如VanRossum所说,根据官方数据,最新发布的Python3.11比Python3.10快了10-60%,更加人性化。经过17个月的开发,此版本现已公开发布。Python3.11的具体改进主要体现在:更详细的ErrorTracebacks、更快的代码执行、更好的异步任务语法、改进的类型变量、支持TOML配置解析,以及其他一些很酷的特性(包括快速启动、零成本异常处理、异常组等)。PabloGalindoSalgado是Python指导委员会成员和核心开发人员,同时也是Python3.10/3.11的发布经理,他说为使3.11成为可能的Python最佳版本做了大量工作。Python3.11的新特性错误追溯Python是一种对初学者友好的编程语言,具有易于理解的语法和强大的数据结构。但是对于刚接触Python的人来说,有一个难题,就是Python遇到错误时显示的traceback如何解读。Python3.11为回溯添加了装饰性注释,以帮助用户更快地解释错误消息。要获得此功能,请将以下代码添加到inverse.py文件中。例如,您可以使用inverse()来计算数字的倒数。由于0没有倒计时,运行以下代码时会抛出错误。请注意回溯中嵌入的^和~符号,它们指向导致错误的代码。与之前的回溯一样,您应该从底部开始,逐步向上。这种操作对于查找错误非常有用,但是如果代码太复杂,带注释的回溯会更好。更快的代码执行Python是出了名的慢,例如,在Python中,一个常规循环比C中的类似循环慢几个数量级。Python官方正在努力改进这个缺陷。2020年秋季,MarkShannon提出了Python的几项性能改进。这个提议被称为香农计划(ShannonPlan),他们希望在几次版本更新中将Python的速度提高5倍。微软不久后正式加入该倡议,该公司正在支持开发人员,包括MarkShannon和GuidovanRossum,致力于“FasterCPython”项目。“FasterCPython”项目中的一个重要提案是PEP659,Python3.11在此基础上进行了许多改进。PEP659描述了一个“专门的自适应解释器”。主要思想是通过优化频繁执行的操作来加速代码,类似于JIT(即时)编译。只是不影响编译,Python的字节码是动态调整或变化的。研究人员在字节码生成中添加了一个称为“加速”的新步骤,它允许在运行时优化指令并用自适应指令替换它们。一旦该函数被调用了一定次数,加速指令就会启动。在CPython3.11中,加速在八次调用后开始。您可以通过使用自适应参数调用dis()来观察解释器如何适应字节码。在基准测试中,CPython3.11平均比CPython3.10快25%。FasterCPython项目是一个正在进行的项目,已经计划在2023年10月与Python3.12一起发布多项优化。您可以在GitHub上关注该项目。项目地址:https://github.com/faster-cpython/ideas更好的异步任务语法Python中对异步编程的支持已经发展了很长时间。生成器是在Python2中添加的,asyncio库最初是在Python3.4中添加的,async和await关键字是在Python3.5中添加的。在Python3.11中,您可以使用任务组,它为运行和监视异步任务提供了更简洁的语法。改进的类型变量Python是一种动态类型的语言,但它通过可选的类型提示支持静态类型。Python静态类型系统的基础是在2015年的PEP484中定义的。自Python3.5以来的每个Python版本都引入了几个与类型相关的新提议。Python3.11以五个与类型相关的PEP创下新高:PEP646:可变泛型PEP655:将单个TypedDict项目标记为必需或可能缺失PEP673:自我类型PEP675:任意文字字符串类型PEP681:数据类转换支持TOML配置解析TOML是Tom'sObviousMinimalLanguage的缩写。这是一种在过去十年中流行起来的配置文件格式。在为包和项目指定元数据时,Python社区采用TOML作为首选格式。虽然TOML已经使用多年,但Python并没有内置对TOML的支持。当tomllib添加到标准库时,Python3.11中的情况发生了变化。这个新模块建立在toml第三方库之上,并允许解析TOML文件。下面是一个名为units.toml的TOML文件的示例:其他特性除了上面的主要更新和改进之外,Python3.11还有许多值得探索的特性,例如更快的程序启动、更多的异常更改以及对Minorimprovements的支持到字符串格式。更快的程序启动FasterCPython项目的成果之一是更快的启动时间。运行Python脚本时,解释器初始化需要一些操作。这导致即使是最简单的程序也需要几毫秒才能运行。在很多情况下,与运行代码所需的时间相比,启动程序所需的时间可以忽略不计。但在短时间运行的脚本中,例如典型的命令行应用程序,启动时间会显着影响程序性能。例如,考虑以下脚本,它的灵感来自经典的cowsay程序。在snakesay.py中,您从命令行读取消息并将其打印在上面有一条可爱蛇的对话泡泡中。你可以让蛇说任何话。下面是一个命令行应用程序的基本示例,它运行得非常快,但仍需要几毫秒。这种开销的很大一部分发生在Python导入模块时。您可以使用-Ximporttime选项来显示导入模块所用的时间。表中的数字以微秒为单位,最后一列是模块名称的格式。该示例分别在Python3.11和3.10上运行,结果如下图所示。Python3.11导入速度更快,这有助于Python程序启动更快。零成本异常异常的内部表示在Python3.11中有所不同。异常对象更轻量级,异常处理也发生了变化。所以只要不触发except子句,try...except块中的开销就更少。所谓的零成本异常是受C++和Java等其他语言的启发。当您的源代码被编译为字节码时,编译器会创建跳转表,从而实现零成本异常。如果引发异常,将查询这些跳转表。如果没有异常,则try块中的代码没有运行时开销。异常组之前,您了解了任务组以及它们如何同时处理多个错误。这一切都要归功于一项名为异常组的新功能。我们可以把异常组看作是包裹了其他几个常规异常的常规异常。虽然异常组在许多方面表现得像常规异常,但它们还支持特殊语法,可帮助您有效地处理每个包装的异常。您可以通过给出描述并列出包装的异常来创建异常组,如下所示。异常注释一般异常具有添加任意注释的可扩展性。您可以使用.add_note()向任何异常添加注释,并通过检查.__notes__属性查看现有注释。负零格式在使用浮点数进行计算时,你可能会遇到一个奇怪的概念——负零。您可以观察到负零和常规零在REPL中的呈现方式不同,如下所示。有关Python3.11更新的更多详细信息,请参阅原始文档。