首页 > 编程语言 >Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型

Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型

时间:2022-10-14 13:37:04浏览次数:81  
标签:-------- 调用 CPython Python list range 3.9 vectorcall

Python 的 3.9.0 版本正在开发中,计划在 2020-10-05 发布 final 版本。

官方在 ​​changelog​​ 中披露了很多细节,其中有一项“vectorcall”特性是最容易被接受的,本文打算带大家先来一探究竟。

事实上,早在 Python 3.8 版本中就已部分地实现了 vectorcall,只不过它是暂时性的,被隐藏起来了,按计划是在 3.9 版本中实现完全体。下图是 3.8 版本中的简介:

Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型_内置类型

那么,什么是 vectorcall 呢?它会带来哪些变化呢?

“a fast calling protocol for CPython”,即它是 CPython 的一种快速调用协议,可以加速 CPython 解释器在调用类对象时的速度。

(PS:需要注意的是,这里说的“协议”是一种广义的称呼,它跟我们熟知的网络协议或通信协议不同,可理解为对代码作调用时的一种约定、一种实现方式)

这种协议是在 ​​PEP-590​​​ 中被提出的(时间是 2019-03-29),对应的 bpo 是 ​​issue37207​​,历时近一年的开发,目前它的实现已合入了代码仓。

Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型_内置类型_02

用一句话概括它的核心要点是:它将提升 list()、tuple()、dict() 等主要类型的调用速度,同时它还可以被用在自定义的类上。

结合 PEP 与 bpo 信息,我提炼了以下的详细要点:

  • vectorcall 是对 fastcall 的正式化。在之前的 CPython 中存在一些零散的优化点(即 fastcall),如今官方把它们系统化了,给出了一个正式的“vectorcall”称呼
  • vectorcall 适用于多数内置类型。据当前的披露信息,它适用于 list、tuple、dict、set、frozenset 与 range 这 6 种主要的内置类型(部分测量数据显示,速度提升率达 10%~30%)
  • vectorcall 是对性能与灵活性的调和。之前的解释器具有很高的灵活性,但是在对象调用过程中,存在不必要的中间对象以及间接的调用开销,如今是设法消除了这部分开销,得以提升了性能

PEP-590 中还详细介绍了 CPython 的实现细节,并罗列了 C API 的变化点,这部分内容就不展开了,感兴趣的同学请自行查阅文档。

--------猫哥碎碎念分割线--------

主要的内容就算介绍完了,它很简单,并不难理解,不会带来学习的负担,也不会造成什么意见分歧。

但是说句老实话,这个性能提升可能显得有点“费力不讨好”:内置类型的调用速度并不会造成什么性能问题(并不慢),而提升空间也仅是纳秒/微秒级别,非常有限。多名核心开发者花费大半年时间和精力,到底值不值得?

我们恐怕都没有对此作出价值评判的资格。仁者见仁,智者见智。

但是,也许我们可以往乐观的方面想:对于这种微不足道的性能提升,核心开发者们都能认真对待、精益求精、持续投入、考虑全面,那在其它方面上也绝不会逊色。所以,我们有理由对 Python 的未来保持乐观的希望!

--------猫哥碎碎念分割线--------

相关链接:

​https://docs.python.org/3.9/whatsnew/changelog.html​

​https://www.python.org/dev/peps/pep-0590​

​https://bugs.python.org/issue37207​

Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型_python_03



标签:--------,调用,CPython,Python,list,range,3.9,vectorcall
From: https://blog.51cto.com/u_14244765/5756336

相关文章

  • Python 如何移除旧的版本特性,如何迎接新的特性?
    2020年4月20日,Python2的最后一个版本2.7.18发布了,这意味着Python2是真正的EOL(endoflife)了,一个时代终于落幕了。Python2.0版本是在2000年发布的,至今正好......
  • Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
    毫无疑问Python中没有所谓的main入口函数,但是网上经常看到一些文章提“Python的main函数”、“建议写main函数”……有些人是知情的,他的意图可能是模仿那些正宗的......
  • Python 为什么不用分号作终止符?
    一般而言,编程语言中使用分号“;”来实现两种目的:作为语句分隔符:使用分号来分隔语句(statement),这样就能在一行代码中书写多条语句(一行多句)作为语句终止符:使用分号来终止语句,这......
  • Python小技巧:如何批量更新已安装的库?
    众所周知,升级某个库(假设为xxx),可以用​​pipinstall--upgradexxx​​​命令,或者简写成​​pipinstall-Uxxx​​。如果有多个库,可以依次写在xxx后面,以空格间隔。那......
  • 一篇文章掌握 Python 内置 zip() 的全部内容
    一篇文章掌握Python内置zip()的全部内容zip()是Python中最好用的内置类型之一,它可以接收多个可迭代对象参数,再返回一个迭代器,可以把不同可迭代对象的元素组合起来。......
  • Python 之父爆料:明年至少令 Python 提速 1 倍!
    大概在半年前,我偶然看到一篇文章,有人提出了给Python提速5倍的计划,并在寻找经费赞助。当时并没有在意,此后也没有看到这方面的消息。但是,就在5月13日“2021年Python......
  • Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?
    本文出自“Python为什么”系列,请查看​​全部文章​​在日常使用Python时,我们经常需要创建一个列表,相信大家都很熟练了吧?#方法一:使用成对的方括号语法list_a=[]#方法......
  • Python最会变魔术的魔术方法,我觉得是它!
    在​​上篇文章中​​,我有一个核心的发现:Python内置类型的特殊方法(含魔术方法与其它方法)由C语言独立实现,在Python层面不存在调用关系。但是,文中也提到了一个例外:一个非......
  • Python 中的数字到底是什么?
    花下猫语:在Python中,不同类型的数字可以直接做算术运算,并不需要作显式的类型转换。但是,它的“隐式类型转换”可能跟其它语言不同,因为Python中的数字是一种特殊的对象,派生......
  • Python 为什么要有 pass 语句?
    本文出自“Python为什么”系列,请查看​​全部文章​​关于Python中的​​pass​​语句,它似乎很简单(只有4个字母),即使是没有任何编程经验的初学者也能很快地掌握它的用法......