Python 3.9 最新內幕,這些內置類型將迎來性能提升

Python 的 3.9.0 版本正在開發中,計劃在 2020-10-05 發佈 final 版本。

官方在 changelog 中披露了很多細節,其中有一項“vectorcall”特性是最容易被接受的,本文打算帶大家先來一探究竟。

事實上,早在 Python 3.8 版本中就已部分地實現了 vectorcall,只不過它是暫時性的,被隱藏起來了,按計劃是在 3.9 版本中實現完全體。下圖是 3.8 版本中的簡介:

Python 3.9 最新內幕,這些內置類型將迎來性能提升

3.8版本的介紹

那麼,什麼是 vectorcall 呢?它會帶來哪些變化呢?

“a fast calling protocol for CPython”,即它是 CPython 的一種快速調用協議,可以加速 CPython 解釋器在調用類對象時的速度。

(PS:需要注意的是,這裡說的“協議”是一種廣義的稱呼,它跟我們熟知的網絡協議或通信協議不同,可理解為對代碼作調用時的一種約定、一種實現方式)

這種協議是在 PEP-590 中被提出的(時間是 2019-03-29),對應的 bpo 是 issue37207,歷時近一年的開發,目前它的實現已合入了代碼倉。

Python 3.9 最新內幕,這些內置類型將迎來性能提升

bpo信息

用一句話概括它的核心要點是:它將提升 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



分享到:


相關文章: