Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型
Python 的 3.9.0 版本正在开发中,计划在 2020-10-05 发布 final 版本。
官方在 changelog 中披露了很多细节,其中有一项“vectorcall”特性是最容易被接受的,本文打算带大家先来一探究竟。
事实上,早在 Python 3.8 版本中就已部分地实现了 vectorcall,只不过它是暂时性的,被隐藏起来了,按计划是在 3.9 版本中实现完全体。下图是 3.8 版本中的简介:
那么,什么是 vectorcall 呢?它会带来哪些变化呢?
“a fast calling protocol for CPython”,即它是 CPython 的一种快速调用协议,可以加速 CPython 解释器在调用类对象时的速度。
(PS:需要注意的是,这里说的“协议”是一种广义的称呼,它跟我们熟知的网络协议或通信协议不同,可理解为对代码作调用时的一种约定、一种实现方式)
这种协议是在 PEP-590 中被提出的(时间是 2019-03-29),对应的 bpo 是 issue37207,历时近一年的开发,目前它的实现已合入了代码仓。
用一句话概括它的核心要点是:它将提升 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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JVM源码分析之JDK8下的僵尸(无法回收)类加载器
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 这篇文章基于最近在排查的一个问题,花了我们团队不少时间来排查这个问题,现象是有一些类加载器是作为key放到WeakHashMap里的,但是经历过多次full gc之后,依然坚挺地存在内存里,但是从代码上来说这些类加载器是应该被回收的,因为没有任何强引用可以到达这些类加载器了,于是我们做了内存dump,分析了下内存,发现除了一个WeakHashMap外并没有别的GC ROOT途径达到这些类加载器了,那这样一来经过多次FULL GC肯定是可以被回收的,但是事实却不是这样,为了让这个问题听起来更好理解,还是照例先上个Demo,完全模拟了这种场景。 Demo 首先我们创建两个类AAA和AAB,分别打包到两个不同jar里,比如AAA.jar和AAB.jar,这两个类之间是有关系的,AAA里有个属性是AAB类型的,注意这两个jar不要放到classpath里让appClassLoader加载到: public class AAA { private AAB aab; public AAA(){ aab=new AAB(); } ...
- 下一篇
免费建站系统,Joomla 3.9.18 发布
Joomla 3.9.18现已发布。这是Joomla 3.x系列的错误修正版本,解决了一个错误。 3.9.18是什么? Joomla 3.9.18解决了一个错误: 错误修复和改进 修复了单个标签视图错误地显示404页面的问题
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境