Python 3.12 概述:过去的局限性、更快的 CPython 的出现以及新版本的兴奋

Python自问世以来,在编程语言序列中确立了独特的地位。它因其简单性和可读性而备受推崇,一直是众多应用程序的基础,从 Web 开发到科学研究。

Python自问世以来,在编程语言序列中确立了独特的地位。它因其简单性和可读性而备受推崇,一直是众多应用程序的基础,从 Web 开发到科学研究。

然而,它的赞誉总是有一个星号——它的表现。在相当长的一段时间里,Python被贴上了“慢”语言的标签,这种情绪甚至在今天在某些方面重复出现。然而,几年前,随着 Faster CPython 的出现,这种声誉面临着潜在的转变。这个新的化身专注于涡轮增压 Python 的性能,不仅旨在解决由来已久的速度问题,还旨在解决一系列遗留问题。

话虽如此,现在让我们更深入地研究这一遗产的复杂性,找出最新版本的编程语言之一的新功能,并阐明它最近受到如此多关注的原因。

更快的 CPython:背景和现在的情况

Guido Van Rossum,受人尊敬的Python创造者,最近与Microsoft结盟,将所有人的目光转向最新版本的Python的发展。

在 2021 年 Python 语言峰会上,van Rossum 展示了他雄心勃勃的努力:与他在 Microsoft 资金支持下组建的专门团队合作。他们的使命非常明确——将性能增强引入解释器,同时确保完整的 C API 保持不变。此举至关重要,尤其是为了保证 Python 扩展继续无缝运行。

CPython 的性能增强这个话题并不是什么新鲜事——事实上,它一直是年度语言峰会上反复出现的主题。马克·香农(Mark Shannon)在他的提议中阐明了一项战略计划,该计划旨在将语言的速度提高惊人的5倍。这个计划在 Python 3.11 中已经显示出其有效性,展示了一个充满希望的轨迹。

这些进步的核心是 Faster CPython 项目。它的亮点在于它对默认 CPython 解释器的创新方法。通过使用实时编译器技术的优势,它可以识别可以从这种复杂的解决方案中受益匪浅的代码段。结果是创建了以更快的速度运行的新指令,从而提高了 Python 语言的整体性能。值得一提的是,van Rossum 呼吁以透明的方式在 GitHub 上开展协作工作。Faster CPython 存储库充当代码、概念、工具、问题管理、功能对话等的中心。

现实世界的基准已经呼应了这项工作的成功。Python 3.11 alpha 6 版本与其前身 Python 3.10 相比,性能提升了约 19%。随着 Python 3.11 alpha 7 的发布,人们的期望值飙升得更高。Python 3.11 接受了 Shannon 每年 1.5 倍的性能激增的预测,已经展示了这些努力的结果。

目前,我们正处于这个变革阶段的顶峰,技术社区热切地等待着辨别多年来为提高 Python 性能而不懈努力的成果。现在是时候仔细看看 3.12 版本中等待的内容,以评估和进一步预测 Python 的加速。但首先,为了连续性起见,让我们回顾一下前面的内容。

Python 的演变:版本 3.9 至 3.11

如前所述,随着van Rossum搬到Microsoft,Python受到了更多的关注,这发生在3.9版本左右。在这个版本和后续版本中,出现了无数的功能和改进。性能优化尤为突出。这种对速度的追求不仅仅是数字上的提高,而是开发人员在日常编码任务中感受到的切实增强。这些改进可以加快代码执行速度,减少资源消耗,并提供更流畅的整体 Python 体验。

此外,这些版本还引入了各种功能,丰富了语言的功能。从改进的数据类型处理到增强的库,开发人员发现自己可以使用更强大的工具。

社区对这些更新的反应非常积极。论坛、博客和讨论线程中充斥着开发人员分享他们的经验、提供技巧并热切地尝试新功能。

正如预期的那样,这种热情并不仅仅局限于过去的更新。对 Python 3.12 的期望是显而易见的。关于其潜在功能、性能升级以及它可能为 Python 的未来设定的轨迹的猜测已经获得了动力。

Python 3.12:主要功能和增强功能

F-strings 句法改头换面

现在,任何有效的 Python 表达式都可以在 f 字符串的表达式部分中使用。这包括使用与外部 f 字符串相同的引号、将表达式扩展到多行、添加注释、使用反斜杠以及合并 Unicode 转义序列。

理解内联

Python 中的推导内联已经过优化,现在内联了字典、列表和集合推导式,这消除了每次执行推导时创建新的一次性函数对象的需要,这可能会使推导执行速度提高一倍。但是,内联会引入一些行为更改,例如修改的回溯显示、对“symtable”模块的更改以及推导中“locals()”函数行为的变化。

CPython 中的最小开销监控

PEP 669 在 CPython 中引入了一个新的 API,使分析器和调试器等工具能够以更高的效率监控各种事件,例如调用、返回和异常。这确保了最小的开销,使调试器和覆盖率工具对性能更加友好。值得注意的是,从 Python 3.12 开始,解释器可以在一种特殊模式下运行,该模式与 Linux“perf”分析器集成,这是一个具有强大生态系统的强大工具,允许 Python 函数在其输出中可见。

改进的模块:Asyncio

Asyncio 的套接字写入性能有了相当大的提升。现在,它最大限度地减少了套接字写入期间的冗余复制,并在平台允许的情况下利用 sendmsg()。

增强的专业化

动态语言(如 Python)的虚拟机专业化是根据程序中存在的特定类型和值定制代码执行的过程。

已经进行了细致的分析,以辨别哪些字节码将从专业化中获益匪浅。Python 3.12 的目标是最终确定剩余的高影响力专业化,从而获得性能回报。

这种自适应和推测性专业化可能会将性能提高多达 50%,确保 Python 即使在动态响应代码模式更改时也能更高效地运行,而不会因专业化错误而产生高成本。这是一个核心问题,用于监控哪些字节码已经专用化,哪些字节码需要专用化,哪些字节码可以从改进中受益,或者哪些字节码不适合专用化。

多线程并行性

从历史上看,Python 的主要障碍是每个进程只有一个全局解释器锁,从而抑制了多线程并行性。Python 3.12 解决了 PEP 684 中详述的此限制,过渡到每个子解释器的全局解释器锁 (GIL)。此外,PEP 554 旨在允许直接从 Python 创建子解释器,这是以前 C API 独有的属性。这一变化标志着真正的多线程并行性的开始。

多线程并行性代表了 Python 的根本性转变,它为未来的创新奠定了基础,而不是提供即时的开箱即用解决方案。计划在 Python 3.13 中提供更具体的 API,它目前是一个等待进一步完善的框架。至关重要的是,正如 PEP 554 的这一部分所述,此功能可确保解释器之间的可靠隔离;数据只能通过序列化在它们之间交换,例如将“int”对象转换为其底层原始数据,从而确保数据完整性并防止数据混合。

工具化内存管理

Python 3.12 旨在实现高效的内存利用率。它是通过减小对象的大小(请参阅此处的实例)以及采用更一致的对象布局来完成的。内存结构中的这些增强功能优化了分配和释放过程。

已弃用的功能

Python 3.12 延续了其维护干净高效代码库的传统,将从“unittest”模块中删除一些以前弃用的功能。此列表包括方法别名、某些断言方法和 TestLoader 中的特定参数,确保模块保持精简和最新。

此外,PEP 623 对 Python 的内存占用进行了重大优化。通过从 Python 的 C API 中的 Unicode 对象中删除“wstr”,每个“str”对象将至少轻 8 个字节。此更改提供了潜在的性能改进,并使 Python 程序的内存使用效率更高。

除了重要的弃用之外,“distutils”包将不再是标准库的一部分。开发人员被引导到迁移指南,了解此软件包以前提供的功能的替代方案。值得注意的是,对于那些仍然需要“distutils”的人,第三方软件包“setuptools”将继续提供它。

更快的 CPython 的影响

直接和间接地,Faster CPython 对这些功能的影响是不可否认的。通过不断突破性能和优化的界限,它为 Python 3.12 的巨大进步奠定了基础。

由此,我们现在可以看到 Python 3.12 承诺将速度、效率和多功能性融为一体。凭借其大量的增强功能(其中一些在这里没有提到;您可以在官方页面上找到它们),它旨在重新定义编码体验。

回顾 Python 的发展轨迹及其在增强性能方面取得的进步,Faster CPython 的出现无疑是其丰富叙事的一个转折点。大量的贡献、开源项目和围绕问题的积极讨论展示了一个充满活力的社区,他们渴望突破 Python 的界限,确保它始终处于卓越编程的最前沿。Python 的未来似乎很有希望,因为它是由那些参与其中的人塑造的。

发表评论

邮箱地址不会被公开。 必填项已用*标注