Python之父:明年讓Python快2倍
5月中旬剛剛結(jié)束的Pycon US 2021上,Python之父Guido van Rossum提出要在未來(lái)四年內(nèi)將CPython速度提升5倍。
而這一“Shannon計(jì)劃”的參與者除了Guido本人之外,還有任職微軟的CPython核心開(kāi)發(fā)人員Eric Snow,以及Semmle的研究工程師Mark Shannon。
但在此之前,Guido可并不認(rèn)為提升CPython的速度有多關(guān)鍵,因?yàn)?ldquo;有其他方法可以獲得更好的性能”,比如JIT編譯的PyPy,或使用C語(yǔ)言編寫(xiě)擴(kuò)展。
為什么要加速?
Python真的慢嗎?
不見(jiàn)得,開(kāi)發(fā)效率和執(zhí)行速度本就難以兼得。
而且發(fā)展到今天,Python已經(jīng)是一個(gè)膠水語(yǔ)言的定位,主要用來(lái)快速構(gòu)建系統(tǒng)的邏輯控制流,再把對(duì)性能要求高的部分丟給C/C++來(lái)實(shí)現(xiàn)。
不過(guò)如果只看標(biāo)準(zhǔn)版的語(yǔ)言實(shí)現(xiàn)本身的話(huà)……它的性能確實(shí)不怎么樣。
動(dòng)態(tài)語(yǔ)言的特性決定了Python會(huì)在C語(yǔ)言代碼運(yùn)行(runtime)上花費(fèi)大量的時(shí)間,且難以使用JIT(Just-In-Time)進(jìn)行優(yōu)化。
在接受英國(guó)技術(shù)新聞網(wǎng)站The Register的采訪時(shí),對(duì)于“為什么開(kāi)始關(guān)注CPython性能?”的問(wèn)題,Shannon表示:
過(guò)去幾年里,Python在機(jī)器學(xué)習(xí)領(lǐng)域的使用率大大提升,可用資源也越來(lái)越多。這意味著我們可以不用擔(dān)心破壞其可靠性,而是專(zhuān)注在性能上。
并且,Shannon之前參與的HotPy項(xiàng)目中所開(kāi)發(fā)的解釋器,比目前CPython解釋器的純Python代碼快三倍。這證明了對(duì)CPython優(yōu)化的可行性。
而在去年10月份的時(shí)候,耐不住退休寂寞的Guido又加入了微軟:
再加上疫情的家里蹲buff,擁有了更多時(shí)間的大佬們一拍即合,決定Make Python Great Again。
加速之前的挑戰(zhàn)
Shannon坦言,向下兼容是加速Python的最大挑戰(zhàn)。
其實(shí)不僅是對(duì)Python,90年代末libc的那次不兼容更新,直接導(dǎo)致所有應(yīng)用程序都要重編……
而現(xiàn)在已經(jīng)涼涼的Pyston,官方文章里提到的Dropbox放棄Pyston項(xiàng)目的幾大因素中,第一個(gè)也是:
這就是所有既試圖兼容CPython,又想大幅提升性能的Python都會(huì)遇到的嚴(yán)峻問(wèn)題。
因?yàn)镻ython的執(zhí)行類(lèi)似于HTML渲染:更多是對(duì)運(yùn)行時(shí)應(yīng)如何執(zhí)行C庫(kù)的描述,而非單步執(zhí)行命令。
所以,Python性能提升的源頭來(lái)自于這些C擴(kuò)展模塊。而CPython又有著超過(guò)400k的loc,這意味著要從底層去做優(yōu)化是一項(xiàng)非常龐大的工程。
特別是對(duì)于過(guò)于動(dòng)態(tài)的Python語(yǔ)言來(lái)說(shuō),語(yǔ)言的語(yǔ)義對(duì)優(yōu)化的影響就更大了。
而現(xiàn)在加速的過(guò)程中,像是CPython的工具、調(diào)試器、配置文件,NumPy包,以及Cython這樣的編譯器,又會(huì)有多少涉及到CPython內(nèi)部和底層的行為?
因此Shannon表示:
要改變是困難的……與CPython用戶(hù)間的隱形協(xié)議并沒(méi)有很好地定義什么能改,什么不能改。
可能是五年前從Python2.x遷移到3的痛苦經(jīng)歷實(shí)在是有些刻骨銘心,Guido專(zhuān)門(mén)發(fā)推表示這次的遷移會(huì)更加平和。
而他也在Python峰會(huì)中承諾:不破壞stable ABI兼容性;不破壞limited API兼容性;不破壞或減緩extreme cases。
“總之,代碼的可維護(hù)性才是第一要?jiǎng)?wù)。”
Python的5倍速之路
按照已在GitHub上發(fā)布的faster-cpython,Shannon計(jì)劃具體分為四個(gè)階段:
Python 3.10
預(yù)計(jì)在今年10月發(fā)布,主要添加一個(gè)自適應(yīng)、專(zhuān)業(yè)化的解釋器(interpreter)。
解釋器將不再遇運(yùn)行時(shí)生成代碼,而是利用程序中的類(lèi)型穩(wěn)定性,在執(zhí)行過(guò)程中適應(yīng)類(lèi)型和數(shù)值。
Python 3.11
Guido提出要在3.11版本實(shí)現(xiàn)至少2倍的提速,為此,他已經(jīng)和幾位Python開(kāi)發(fā)人員提出了一份增強(qiáng)功能的提案PEP 659。
這一提案中表示要增加適應(yīng)性的字節(jié)碼解釋器,并且實(shí)施更有效的異常處理。
除此之外,還提出了優(yōu)化幀堆棧、改變函數(shù)調(diào)用的方式、增加優(yōu)化以加快啟動(dòng)時(shí)間,以及修改 .pyc 字節(jié)碼緩存文件格式等工作。
Python 3.12
這一階段使用針對(duì)小區(qū)域的JIT解釋器,在運(yùn)行代碼時(shí)簡(jiǎn)單、快速地對(duì)小區(qū)域的專(zhuān)門(mén)代碼進(jìn)行編譯。
Python 3.13
同樣在代碼運(yùn)行時(shí)對(duì)擴(kuò)展區(qū)域進(jìn)行編譯,增強(qiáng)編譯器,以完成5倍的超級(jí)加速。
Guido表示此次圍繞性能展開(kāi)的 Python 變更,將主要服務(wù)于運(yùn)行CPU密集型純Python代碼的開(kāi)發(fā)者,以及內(nèi)置Python網(wǎng)站的用戶(hù)。
而在C語(yǔ)言代碼(如 NumPy和TensorFlow)、I/O 綁定代碼、多線程代碼以及算法代碼上,提升效果將會(huì)比較有限。
微軟回饋Python
其實(shí),微軟長(zhǎng)期以來(lái)一直以多種方式為Python項(xiàng)目提供助力,包括在Azure云AI服務(wù)教程里發(fā)布免費(fèi)的Python課程,以及通過(guò)VS Code Python擴(kuò)展在Win10及以上版本支持Python。
自 2006 年起,微軟還成為了Python軟件基金會(huì)(PSF)的贊助商,并在今年出資15 萬(wàn)美元進(jìn)行資助。
目前已有五位Python開(kāi)發(fā)者社區(qū)的核心人員在微軟任職,包括去年年底加入的Python之父,和這次Shannon計(jì)劃里的三人之一Eric Snow。
Guido也在這次峰會(huì)里特地cue了一下微軟,提出微軟資助了一支小型Python團(tuán)隊(duì)“負(fù)責(zé)語(yǔ)言解釋層面的性能改進(jìn)工作”,以使他能攜手微軟同事持續(xù)對(duì)Python進(jìn)行開(kāi)發(fā)。
當(dāng)然,對(duì)于3.11版本的短期目標(biāo),Guido還是在ppt中給自己兜了個(gè)底。
△“樂(lè)觀一點(diǎn),好奇一點(diǎn)總沒(méi)錯(cuò)”
而對(duì)于那個(gè)四年五倍速的最終目標(biāo),Guido則表示“我們必須保持旺盛的創(chuàng)造力。”