淺讀種種Python性能使用問題
在Python語言中:運(yùn)用Python性能編寫的代碼、做的測(cè)試,然后將比較重要的部分轉(zhuǎn)化為CPython以提高其速度,這大大的體現(xiàn)了Python性能所在,下面進(jìn)行詳細(xì)剖析。
近來傳聞Google將在其新項(xiàng)目中限制Python的使用,為此有開發(fā)者(以K表示)在Google 論壇中公開詢問了Collin Winter,Collin Winter就很多尖銳的問題做了解答。這篇帖子同時(shí)也吸引了很多高質(zhì)量的跟帖。K:我聽說Google將在其新項(xiàng)目中限制Python的使用,無疑這將大大減少Python代碼和Python得到的支持。這是否確有其事還是只是謠傳?
Collin Winter:的確,Google將限制Python的應(yīng)用因?yàn)椋?FONT size=+0>Python不如Java和C++快,線程占有、內(nèi)存使用都很高在使用Python開發(fā)新系統(tǒng)的時(shí)候。我們深知如果負(fù)載增加了10倍或者100倍系統(tǒng)會(huì)怎樣,開發(fā)出的服務(wù)會(huì)有多糟糕我想Python已經(jīng)發(fā)展到了一個(gè)狹縫中。
因此在選擇時(shí)我們應(yīng)當(dāng)權(quán)衡其優(yōu)點(diǎn)和缺點(diǎn),也許開發(fā)人員使用Python會(huì)很有效率,但隨著系統(tǒng)的增大卻會(huì)遇到許多平臺(tái)級(jí)的性能限制。K:Unladen Swallow會(huì)改變這一切么?你的期望是什么呢?Collin Winter:Unladen Swallow旨在盡可能地將Python用在更多它現(xiàn)在尚未涉足的地方。
而且Unladen Swallow也并非包治百病的靈丹妙藥。如果沒有人給Python注入投資,Python將仍舊比C和Java慢、占用更多的內(nèi)存和線程。我希望開發(fā)者對(duì)Python的關(guān)注能夠形成一個(gè)良性循環(huán):越多的開發(fā)者感興趣、越多的公司干興趣,就有越多的投資注入,從而開發(fā)出更多的Python資源。
我認(rèn)為Python及其他動(dòng)態(tài)語言最好的一點(diǎn)就是:許多開發(fā)者工作于不同的子系統(tǒng),但都為同一個(gè)代碼基工作。而C或者C++語言則不同,參與的開發(fā)者越多,代碼基就越支離破碎。從這個(gè)角度來說動(dòng)態(tài)語言更加易于sandbox操作。這種敏捷和靈活是Python語言的重要特性。
K:Python的確是比C和Java慢,但它比較起v8 JavaScript引擎如何,是否會(huì)是后者的競(jìng)爭(zhēng)對(duì)手呢?Collin Winter:我認(rèn)為像CPython之類的應(yīng)用不可能像V8或者SquirrelFish Extreme那樣快。
畢竟后兩者是專為速度而生的。我們也曾遇到一些高速性能方面的優(yōu)化卻很難配置到CPython中,因而只能放棄。作為開源項(xiàng)目的志愿者,CPython跟V8的側(cè)重點(diǎn)不一樣:CPython強(qiáng)調(diào)的是簡(jiǎn)單.
也即簡(jiǎn)單、稍慢的內(nèi)核便于人們?cè)跇I(yè)余時(shí)間維護(hù)。對(duì)于Python的另一個(gè)項(xiàng)目PyPy我倒是有很高的期望,希望它能擺脫C-level向后兼容的束縛而提供長(zhǎng)久的性能解決方案。但這個(gè)愿望可能需要十年來實(shí)現(xiàn)。
K:CPython為什么考慮的是人們?cè)跇I(yè)余時(shí)間的維護(hù)?Collin Winter:CPython開發(fā)人員很少是有報(bào)酬的,幾乎全部是志愿者,而Ruby開發(fā)者卻能夠從EngineYard等贊助商那里獲得基金。因而當(dāng)他們意識(shí)到MRI伺服web應(yīng)用很慢時(shí),他們可以更好地開發(fā)他們的VM。這也決定了我們開發(fā)的東西更加照顧大多數(shù)人的需求。
一位名叫Leon Sit的開發(fā)者在這里補(bǔ)充道:我認(rèn)為當(dāng)系統(tǒng)增大時(shí),CPython除了在數(shù)字碼方面表現(xiàn)不錯(cuò)之外其他的都差強(qiáng)人意。而且,CPython依賴C編輯器而Windows系統(tǒng)根本沒有C編輯器。
為了提高Python性能的速度,就需要添加打印信息而它們涉及的語法卻非Python的標(biāo)準(zhǔn)語法。K:那么Jython呢?Collin Winter.Unladen Swallow的另一個(gè)主要目標(biāo)是維護(hù)與C擴(kuò)展模塊的兼容性。后者被Google廣泛使用。使用Jython需要將基礎(chǔ)架構(gòu)從SWIG移植到JNI,這是一項(xiàng)很痛苦的工作,而且?guī)缀鯐?huì)無可避免地帶來非常繁瑣的bug。
這是我們?yōu)槭裁礇]有選擇Jython作為baseline的首要原因。Jython是一部分全職的有薪開發(fā)者。但到目前為止,IronPython和Jython不得不將大部分的開發(fā)精力放在與CPython的兼容上。只有很少的精力放在性能優(yōu)化方面。也由此可見支持Python 3多么影響Jython,IronPython, PyPy等項(xiàng)目。網(wǎng)友Tom Machinski認(rèn)為:CPython并非與低階虛擬機(jī)(LLVM)相兼容。
不要誤會(huì)我的意思,我當(dāng)然對(duì)Unladen Swallow項(xiàng)目很感興趣而且希望它能夠真正地實(shí)現(xiàn)目標(biāo)。但我也絕對(duì)認(rèn)同Collin的意思:即便Unladen Swallow項(xiàng)目所有的目標(biāo)都能真正實(shí)現(xiàn),Python也不是Java或者C++的對(duì)手。
有開發(fā)者問:像Google這樣的公司為什么不用Python編寫一個(gè)原型,然后逐漸將核心部分轉(zhuǎn)化為Cyhton,這樣以來既能利用Python的優(yōu)勢(shì),也可以獲得C的效率和優(yōu)化性能?Craig Citro答道:我認(rèn)為對(duì)Google而言這是發(fā)展Python的新計(jì)劃.
用Python性能寫代碼、做測(cè)試,然后將重要部分轉(zhuǎn)化為CPython以提高速度。然而這無疑是一項(xiàng)巨大的工作,而Collin Winter在上文中談到的也不過是提高Python的運(yùn)行速度、讓Python在Google中繼續(xù)保留下去。
而且目前CPython與Unladen Swallow的目標(biāo)有很多矛盾之處,比如在低階虛擬機(jī)(LLVM)方面,Unladen Swallow希望引入許多runtime優(yōu)化和特性,而CPython卻無法做到。但是正如HotSpot JVM在一些標(biāo)準(zhǔn)方面可以打敗g++一樣。
CPython擊敗單純的Python代碼靜態(tài)編輯也不是什么難事。比如,如果你想寫一個(gè)特殊的應(yīng)用而你又很在乎性能,CPython就是很棒的選擇。你可以將對(duì)象轉(zhuǎn)化為本地的C數(shù)據(jù)類型,如果你嫌麻煩而將Python代碼轉(zhuǎn)為CPython,JIT編輯器會(huì)很好地優(yōu)化這些純Python代碼。
注釋: Unladen Swallow是Python的一個(gè)分支,由Google的一組開發(fā)人員組成。由于Google 在很多的應(yīng)用項(xiàng)目中使用了Python,例如內(nèi)部的服務(wù)器監(jiān)控以及對(duì)外的Google Groups等。
所以Google很自然地希望提高Python性能。該項(xiàng)目致力于改善Python的執(zhí)行效率。Unladen Swallow的目標(biāo)是將Python的性能提高五倍。為了實(shí)現(xiàn)該目標(biāo),將增加JIT的支持,并對(duì)虛擬機(jī)進(jìn)行重新設(shè)計(jì)。在性能提升的同時(shí),依舊會(huì)與CPython保證源代碼級(jí)別的兼容。
Unladen Swallow 的項(xiàng)目領(lǐng)導(dǎo)者及核心開發(fā)人員包括: Collin Winter、Jeffrey Yasskin、Thomas Wouters ,均為長(zhǎng)期從事 CPython 的核心開發(fā)人員。他們貢獻(xiàn)自己的20%的自由工作時(shí)間給Unladen Swallow。但是這個(gè)組織堅(jiān)持認(rèn)為這是一個(gè)Python項(xiàng)目,而非Google所有。
【編輯推薦】