Python之父又立Flag:明年讓Python快2倍

2022-01-02 OpenCV學堂

點擊上方↑↑↑「OpenCV學堂」關注我

來源:公眾號 量子位 授權

上周剛剛結束的Pycon US 2021上,Python之父Guido van Rossum提出要在未來四年內將CPython速度提升5倍。

而這一「Shannon計劃」的參與者除了Guido本人之外,還有任職微軟的CPython核心開發人員Eric Snow,以及Semmle的研究工程師Mark Shannon。

但在此之前,Guido可並不認為提升CPython的速度有多關鍵,因為「有其他方法可以獲得更好的性能」,比如JIT編譯的PyPy,或使用C語言編寫擴展。

為什麼要加速?

Python真的慢嗎?

不見得,開發效率和執行速度本就難以兼得。

而且發展到今天,Python已經是一個膠水語言的定位,主要用來快速構建系統的邏輯控制流,再把對性能要求高的部分丟給C/C++來實現。

不過如果只看標準版的語言實現本身的話……它的性能確實不怎麼樣。

動態語言的特性決定了Python會在C語言代碼運行(runtime)上花費大量的時間,且難以使用JIT(Just-In-Time)進行優化。

在接受英國技術新聞網站The Register的採訪時,對於「為什麼開始關注CPython性能?」的問題,Shannon表示:

過去幾年裡,Python在機器學習領域的使用率大大提升,可用資源也越來越多。這意味著我們可以不用擔心破壞其可靠性,而是專注在性能上。

並且,Shannon之前參與的HotPy項目中所開發的解釋器,比目前CPython解釋器的純Python代碼快三倍。這證明了對CPython優化的可行性。

而在去年10月份的時候,耐不住退休寂寞的Guido又加入了微軟:

再加上疫情的家裡蹲buff,擁有了更多時間的大佬們一拍即合,決定Make Python Great Again。

加速之前的挑戰

Shannon坦言,向下兼容是加速Python的最大挑戰。

其實不僅是對Python,90年代末libc的那次不兼容更新,直接導致所有應用程式都要重編……

而現在已經涼涼的Pyston,官方文章裡提到的Dropbox放棄Pyston項目的幾大因素中,第一個也是:

這就是所有既試圖兼容CPython,又想大幅提升性能的Python都會遇到的嚴峻問題。

因為Python的執行類似於HTML渲染:更多是對運行時應如何執行C庫的描述,而非單步執行命令。

所以,Python性能提升的源頭來自於這些C擴展模塊。而CPython又有著超過400k的loc,這意味著要從底層去做優化是一項非常龐大的工程。

特別是對於過於動態的Python語言來說,語言的語義對優化的影響就更大了。

而現在加速的過程中,像是CPython的工具、調試器、配置文件,NumPy包,以及Cython這樣的編譯器,又會有多少涉及到CPython內部和底層的行為?

因此Shannon表示:

要改變是困難的……與CPython用戶間的隱形協議並沒有很好地定義什麼能改,什麼不能改。

可能是五年前從Python2.x遷移到3的痛苦經歷實在是有些刻骨銘心,Guido專門發推表示這次的遷移會更加平和。

而他也在Python峰會中承諾:不破壞stable ABI兼容性;不破壞limited API兼容性;不破壞或減緩extreme cases。

「總之,代碼的可維護性才是第一要務。」

Python的5倍速之路

按照已在GitHub上發布的faster-cpython,Shannon計劃具體分為四個階段:

Python 3.10

預計在今年10月發布,主要添加一個自適應、專業化的解釋器(interpreter)。

解釋器將不再遇運行時生成代碼,而是利用程序中的類型穩定性,在執行過程中適應類型和數值。

Python 3.11

Guido提出要在3.11版本實現至少2倍的提速,為此,他已經和幾位Python開發人員提出了一份增強功能的提案PEP 659

這一提案中表示要增加適應性的字節碼解釋器,並且實施更有效的異常處理。

除此之外,還提出了優化幀堆棧、改變函數調用的方式、增加優化以加快啟動時間,以及修改 .pyc 字節碼緩存文件格式等工作。

Python 3.12

這一階段使用針對小區域的JIT解釋器,在運行代碼時簡單、快速地對小區域的專門代碼進行編譯。

Python 3.13

同樣在代碼運行時對擴展區域進行編譯,增強編譯器,以完成5倍的超級加速。

Guido表示此次圍繞性能展開的 Python 變更,將主要服務於運行CPU密集型純Python代碼的開發者,以及內置Python網站的用戶。

而在C語言代碼(如 NumPy和TensorFlow)、I/O 綁定代碼、多線程代碼以及算法代碼上,提升效果將會比較有限。

微軟回饋Python

其實,微軟長期以來一直以多種方式為Python項目提供助力,包括在Azure雲AI服務教程裡發布免費的Python課程,以及通過VS Code Python擴展在Win10及以上版本支持Python。

自 2006 年起,微軟還成為了Python軟體基金會(PSF)的贊助商,並在今年出資15 萬美元進行資助。

目前已有五位Python開發者社區的核心人員在微軟任職,包括去年年底加入的Python之父,和這次Shannon計劃裡的三人之一Eric Snow。

Guido也在這次峰會裡特地cue了一下微軟,提出微軟資助了一支小型Python團隊「負責語言解釋層面的性能改進工作」,以使他能攜手微軟同事持續對Python進行開發。

當然,對於3.11版本的短期目標,Guido還是在ppt中給自己兜了個底。

「樂觀一點,好奇一點總沒錯」

而對於那個四年五倍速的最終目標,Guido則表示「我們必須保持旺盛的創造力。」

參考連結:
[1]https://www.theregister.com/2021/05/19/faster_python_mark_shannon_author/
[2]https://pyfound.blogspot.com/2021/05/the-2021-python-language-summit-pep-654.html
[3]https://www.python.org/dev/peps/pep-0654/

Python version 3.11.0 alpha 0:
https://github.com/faster-cpython/ideas
「A faster CPython」計劃簡介:
https://github.com/markshannon/faster-cpython

相關焦點

  • Python之父拋棄了Python?
    在10月30日,編程界發生了一件大事,Python之父Guido Van Rossum宣布將會從他為之奮鬥了六年的Dropbox公司退休,Guido Van Rossum在Twitter上轉發了Dropbox團隊寫得《Thank you,Guido》這篇公開信內容。
  • 想學CPython,Python之父Guido親上陣
    標星★置頂公眾號     愛你們♥   就在剛剛(2020年2月10日),Python之父Guido van Rossum在其個人Blog中發布了他對CPython學習的幫助教程。大多數stdlib是用Python編寫的,我們也需要doc幫助2、你必須了解Git和GitHub!
  • 新年Flag:搞定Python,Python書單高級篇
    關注公眾號後回復golang爬蟲、python學習、技能圖譜、html實戰、linux網絡、java並發、教師乾貨、C++教程、
  • Python break用法詳解
    但在某些場景,我們可能希望在循環結束前就強制結束循環,Python 提供了 2 種強制離開當前循環體的辦法:使用 continue 語句,可以跳過執行本次循環體中剩餘的代碼,轉而執行下一次的循環。只用 break 語句,可以完全終止當前循環。本節先講解 break 的用法,continue 語句放到下節做詳細介紹。
  • 仁裁者、Python之父Guido「退位」,python何去何從?
    10月30日,Python之父Guido大牛宣布退休,離開Dropbox。Python任重而道遠雖然python的用戶量近年上升之勢明顯,但並不能撼動像Java、C這樣的元老級程式語言的地位。還是有很多,比如"BATH"、甲骨文等網際網路公司在使用它們或它們的衍生版本(OC、C++)。特別是在遊戲領域,Python的表現並不被看好。
  • 【Python】string 標準庫使用盲區整理
    str1 = '全棧筆記本'str2 = "Python core programming"print("str1[0]: ", str1[0])print("str2[1:5]: ", str2[3:7])輸出結果為
  • Python中判斷數字是否為質數的實例講解
    下面小編向大家演示在python如何判斷數字是否為質數。質數:一個大於1的自然數,除了1和它本身外,不能被其他自然數(質數)整除(2, 3, 5, 7等),換句話說就是該數除了1和它本身以外不再有其他的因數。
  • Python 實現蘿拉遊戲(四連環、重力四子棋)
    1][0]==screen[i][j+2][0]==screen[i][j+3][0] and screen[i][j][0]!=' ':return Falseif j>=3:if screen[i][j][0] == screen[i+1][j-1][0] == screen[i+2][j-2][0] == screen[i+3][j-3][0] and screen[i][j][0] !
  • Python re模塊常見函數
    re.match()函數的使用格式是:re.match(pattern, string, flag)re.search()函數我們還可以使用re.search()函數進行匹配,使用該函數進行匹配,會掃描整個字符串並進行對應的匹配。
  • 用Python實現職工信息管理系統
    請輸入電話')money = input('請輸入工資')# 向列表中添加數據data.append([id, name, sex, age, education, address, photonumber, money])print('添加成功')# 調用保存函數 保存數據save()```2.
  • Python CGI編程
    例如,上面的值為Apache/2.2.14(Unix)以下是一個簡單的CGI腳本輸出CGI的環境變量:#!/usr/bin/python# -*- coding: UTF-8 -*-# 引入 CGI 處理模塊 import cgi, cgitb # 創建 FieldStorage的實例 form = cgi.FieldStorage() # 接收欄位數據if form.getvalue('google'): google_flag = "是"else: google_flag = "否"if form.getvalue
  • 每天5道python題目(4)
    深拷貝:copy.deepcopy 拷貝對象及其子對象 2、問:python中如何實現多線程?答:輸出分別是:<type 『int』><Type 『tuple』>不帶逗號python默認當成一個數字處理,帶逗號則當成元組處理4、問:python中RE模塊match()和search()的區別?
  • python性能提高10倍的通用方法
    這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表要高效的多,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫,在整個python生態中佔有舉足輕重的作用,本篇文章旨在講解如何藉助它來提升python的計算性能。
  • 機器學習如何從Python 2遷移到Python 3
    使用 ** 作為通配符Python2 中使用遞歸文件夾的通配符並不是很方便,因此可以通過定製的 glob2 模塊來解決這個問題。遞歸 flag 在 Python 3.6 中得到了支持。len(pickle.dumps(numpy.random.normal(size=[1000, 1000])))# result: 23691675# Python 3import pickleimport numpylen(pickle.dumps(numpy.random.normal(size=[1000, 1000])))# result: 8000162這個小的改進節省了3倍的空間
  • Python3與Python2 區別
    print(type(3 / 2))2、python3廢棄long類型,統一使用int類型a=111111111111print(type(a))#python2: <type 'long'>#python3: <class 'int'>3、python3 round函數返回int類型,而python2
  • 如何在 i5 上實現 20 倍的 Python 運行速度?
    安裝: % bash Anaconda2-4.3.0-Linux-x86_64.sh安裝英特爾加速器,作為一個單獨的、可開啟關閉的「環境」:% conda config --add channels intel % conda create --name intelpy intelpython2_full python=2運行示例程序,看到在我的 openSUSE
  • 淺談Python Pickle反序列化
    Pickle庫以及函數Python中的序列化操作時可以通過pickle和cPickle兩個模塊進行操作,這兩個模塊一個是純python實現,一個是C語言實現,為了方便,這裡就以pickle庫來進行學習:pickle是python語言的一個標準模塊,實現了基本的數據序列化和反序列化。
  • python運算符總結
    python算術運算符加減乘除是最基本的數學規則,python中當然不能忽視。我們通過交互式解釋器來演示。在cmd命令行下,輸入python回車,即可打開交互式窗口。本文章基於版本python3,老版本中,不等於可以用 <> 來表示,python3已經移除了該運算符。python賦值運算符python和大部分語言一樣,用一個等於號來表示賦值。
  • 如何在Core i5 上實現 20 倍的 Python 運行速度?
    安裝: % bash Anaconda2-4.3.0-Linux-x86_64.sh安裝英特爾加速器,作為一個單獨的、可開啟關閉的「環境」:% conda config --add channels intel % conda create --name intelpy intelpython2_full python=2運行示例程序,看到在我的 openSUSE
  • python學習筆記:條件語句IF
    實例flag= Falsename = 'Clancey'if name == 'python': # 判斷變量是否為 python print('welcome boss') # 並輸出歡迎信息else: print(name) # 條件不成立時輸出變量名稱