雷鋒網(wǎng)消息。PyPy 團(tuán)隊(duì) 21 日通過(guò)官方博客正式發(fā)布了兩個(gè)全新版本:PyPy2.7 v5.7 和 PyPy3.5 v5.7,,即支持 Python v2.7 語(yǔ)法和 Python v3.5 語(yǔ)法的 PyPy 全新版本解釋器,。 據(jù)博客介紹,此次更新的亮點(diǎn)有兩個(gè):
大部分做 Python 開(kāi)發(fā)的人或多或少可能都知道 PyPy:一種基于 Python 實(shí)現(xiàn)的 python 解釋器,。由于其特有的 JIT 動(dòng)態(tài)編譯,因此在運(yùn)行速度上可以輕輕松松超過(guò)標(biāo)準(zhǔn)解釋器 CPython 好幾倍,,甚至有報(bào)道稱在某些極端情況下 PyPy 可以比 CPython 快好幾百倍,。基于這一重大優(yōu)點(diǎn),,PyPy 團(tuán)隊(duì)長(zhǎng)期以來(lái)的奮斗目標(biāo)一直都是超越 CPython,,成為各種 Python 實(shí)現(xiàn)版本中的王者。 但這一夢(mèng)想一直沒(méi)能實(shí)現(xiàn),。究其原因,,一個(gè)重要的障礙可能來(lái)自版本支持:PyPy 的更新一直落后于 Python 語(yǔ)言的主流版本,即它并不支持全部的 Python 語(yǔ)法,,而且往往不適配那些最新的特性,。久而久之,在用戶群里形成了一個(gè)刻板的固有印象:PyPy 只是那些不適配 Python 最新特性的 App 的替代品,。 為了扭轉(zhuǎn)這種并不光彩的固有印象,,PyPy 在最新版本中做出了改變。 PyPy3.5 引入 Python 3 支持改變之一是對(duì) Python 新特性的支持,。 在此次更新的 PyPy3.5 版本中,,PyPy 開(kāi)始全面支持 Python 3 的語(yǔ)法,包括可以更方便地進(jìn)行異步編程(asynchronous programming),。不但如此,,PyPy3.5 還支持在 Python 3.4 中引入的異步模塊 asyncio(包括 async/await 語(yǔ)法),而且有評(píng)論稱,,相對(duì)原版,,該特性在 PyPy 中得到了相當(dāng)大的性能提升。 另外,,在 Python 3.6 中引入的 f-strings 特性,,也在此次更新的 PyPy3.5 版本中得到了支持,。事實(shí)上,f-strings 并非一個(gè)普遍受歡迎的特性,,因?yàn)樗鼉H僅提供了一個(gè)本地字符串格式化的簡(jiǎn)化選項(xiàng),,但此次依然獲得了 PyPy3.5 的支持。這一點(diǎn)或許從另一個(gè)側(cè)面反映了 PyPy 的改變:如果需要,,未來(lái) PyPy 可以支持更多的最新特性,。 對(duì)于這些改變,有評(píng)論認(rèn)為可能是源于去年 Mozilla 基金會(huì)授予 PyPy 團(tuán)隊(duì)的高達(dá) 20 萬(wàn)美元的援助資金?,F(xiàn)在看來(lái),,這項(xiàng)投資似乎物有所值。 PyPy2.7 提升 C 擴(kuò)展包兼容性另一個(gè)改進(jìn)是基于 Python 2 的 C 擴(kuò)展包支持,。 此前 PyPy2(基于 Python 2.x )的開(kāi)發(fā)進(jìn)度一直領(lǐng)先于 PyPy3(基于 Python 3.x ),這次 PyPy2 也沒(méi)有落后,。PyPy2.7 中除了適配 Python 2.x 最新的 bug 修復(fù)版 Python 2.7.13 之外,,最大的亮點(diǎn)在于大大改善了對(duì) C 擴(kuò)展包的兼容性。 此前,,Python 的 C 擴(kuò)展包并不能像其他 Python 代碼一樣流暢地通過(guò) PyPy 解釋運(yùn)行,,而是必須借助一個(gè)名為 cpyext 的 API 兼容層。在此次更新中,,PyPy 進(jìn)一步改善了 cpyext 的效率,,用戶在 PyPy2.7 中可以方便地 import 包括 Numpy、Cython,、Pandas 等在內(nèi)的各種 C 擴(kuò)展包,。 這一點(diǎn)對(duì)與那些只支持 Python 2.x 的項(xiàng)目來(lái)說(shuō)無(wú)疑是個(gè)好消息,但先不要高興的太早,。因?yàn)?PyPy 團(tuán)隊(duì)明確在博客中指出:C 擴(kuò)展包的運(yùn)行速度,,尤其是針對(duì)那些調(diào)用頻繁的 C 語(yǔ)言短函數(shù),PyPy 的運(yùn)行速度可能會(huì)比 CPython 慢,。但同時(shí)團(tuán)隊(duì)也表示,,如果開(kāi)發(fā)者真的發(fā)現(xiàn) PyPy 在運(yùn)行過(guò)程中有速度瓶頸的話,可以隨時(shí)通知他們,,他們會(huì)在第一時(shí)間做出改進(jìn),。 關(guān)于這一點(diǎn),目前一個(gè)有效的解決方案是直接把 C 擴(kuò)展包移植到 PyPy,,就像 NumPy 在 PyPy 下的分支版本 NumPyPy 那樣,,充分利用 PyPy 的原生接口來(lái)集成 C 代碼。但是考慮到這種方案有悖于 PyPy 團(tuán)隊(duì)推出 cpyext 兼容層的初衷,,因此并不是一個(gè)值得推薦的長(zhǎng)期解決方案,。 另外值得一提的是,,消息稱從 2020 年開(kāi)始,社區(qū)將停止對(duì) Python 2.x 版本的支持,。但現(xiàn)實(shí)是,,由于各種各樣的不可抗力,屆時(shí)可能仍然會(huì)有許多團(tuán)隊(duì)不得不繼續(xù)使用 Python 2.x 的代碼,。那時(shí) PyPy 將會(huì)是一個(gè)不錯(cuò)的選擇,畢竟 PyPy 最初就是以 Python 2.x 為核心發(fā)展起來(lái)的,。 |
|