V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chinesehuazhou
V2EX  ›  Python

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

  •  
  •   chinesehuazhou · 2020-04-25 13:01:52 +08:00 · 2268 次点击
    这是一个创建于 1459 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 的未来保持乐观的希望!

    如果你喜欢这种风格的文章,欢迎搜索关注公众号“Python 猫”。人生苦短,让我们一起用 Python !

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

    相关链接:

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

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

    https://bugs.python.org/issue37207

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3592 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:47 · PVG 08:47 · LAX 17:47 · JFK 20:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.