- 首頁(yè)|
- 網(wǎng)校|
- 焚題庫(kù)|
- APP |
-
微信公眾號(hào)
原因:1、python是動(dòng)態(tài)語(yǔ)言;2、python是解釋執(zhí)行,但是不支持JIT;3、python中一切都是對(duì)象,每個(gè)對(duì)象都需要維護(hù)引用計(jì)數(shù),增加了額外的工作。4、python GIL;5、垃圾回收。
當(dāng)我們提到一門編程語(yǔ)言的效率時(shí):通常有兩層意思,第一是開(kāi)發(fā)效率,這是對(duì)程序員而言,完成編碼所需要的時(shí)間;另一個(gè)是運(yùn)行效率,這是對(duì)計(jì)算機(jī)而言,完成計(jì)算任務(wù)所需要的時(shí)間。編碼效率和運(yùn)行效率往往是魚與熊掌的關(guān)系,是很難同時(shí)兼顧的。不同的語(yǔ)言會(huì)有不同的側(cè)重,python語(yǔ)言毫無(wú)疑問(wèn)更在乎編碼效率,life is short,we use python。
雖然使用python的編程人員都應(yīng)該接受其運(yùn)行效率低的事實(shí),但python在越多越來(lái)的領(lǐng)域都有廣泛應(yīng)用,比如科學(xué)計(jì)算 、web服務(wù)器等。程序員當(dāng)然也希望python能夠運(yùn)算得更快,希望python可以更強(qiáng)大。
首先,python相比其他語(yǔ)言具體有多慢,這個(gè)不同場(chǎng)景和測(cè)試用例,結(jié)果肯定是不一樣的。這個(gè)網(wǎng)址給出了不同語(yǔ)言在各種case下的性能對(duì)比,這一頁(yè)是python3和C++的對(duì)比,下面是兩個(gè)case:
從上圖可以看出,不同的case,python比C++慢了幾倍到幾十倍。
python運(yùn)算效率低,具體是什么原因呢,下列羅列一些:
第一:python是動(dòng)態(tài)語(yǔ)言
一個(gè)變量所指向?qū)ο蟮念愋驮谶\(yùn)行時(shí)才確定,編譯器做不了任何預(yù)測(cè),也就無(wú)從優(yōu)化。舉一個(gè)簡(jiǎn)單的例子: r = a + b!和b相加,但a和b的類型在運(yùn)行時(shí)才知道,對(duì)于加法操作,不同的類型有不同的處理,所以每次運(yùn)行的時(shí)候都會(huì)去判斷a和b的類型,然后執(zhí)行對(duì)應(yīng)的操作。而在靜態(tài)語(yǔ)言如C++中,編譯的時(shí)候就確定了運(yùn)行時(shí)的代碼。
另外一個(gè)例子是屬性查找,關(guān)于具體的查找順序在《python屬性查找》中有詳細(xì)介紹。簡(jiǎn)而言之,訪問(wèn)對(duì)象的某個(gè)屬性是一個(gè)非常復(fù)雜的過(guò)程,而且通過(guò)同一個(gè)變量訪問(wèn)到的python對(duì)象還都可能不一樣(參見(jiàn)Lazy property的例子)。而在C語(yǔ)言中,訪問(wèn)屬性用對(duì)象的地址加上屬性的偏移就可以了。
第二:python是解釋執(zhí)行,但是不支持JIT(just in time compiler)。雖然大名鼎鼎的google曾經(jīng)嘗試Unladen Swallow 這個(gè)項(xiàng)目,但最終也折了。
第三:python中一切都是對(duì)象,每個(gè)對(duì)象都需要維護(hù)引用計(jì)數(shù),增加了額外的工作。
第四:python GIL,GIL是Python最為詬病的一點(diǎn),因?yàn)镚IL,python中的多線程并不能真正的并發(fā)。如果是在IO bound的業(yè)務(wù)場(chǎng)景,這個(gè)問(wèn)題并不大,但是在CPU BOUND的場(chǎng)景,這就很致命了。所以筆者在工作中使用python多線程的情況并不多,一般都是使用多進(jìn)程(pre fork),或者在加上協(xié)程。即使在單線程,GIL也會(huì)帶來(lái)很大的性能影響,因?yàn)閜ython每執(zhí)行100個(gè)opcode(默認(rèn),可以通過(guò)sys.setcheckinterval()設(shè)置)就會(huì)嘗試線程的切換,具體的源代碼在ceval.c::PyEval_EvalFrameEx。
第五:垃圾回收,這個(gè)可能是所有具有垃圾回收的編程語(yǔ)言的通病。python采用標(biāo)記和分代的垃圾回收策略,每次垃圾回收的時(shí)候都會(huì)中斷正在執(zhí)行的程序,造成所謂的頓卡。infoq上有一篇文章,提到禁用Python的GC機(jī)制后,Instagram性能提升了10%。
下一篇:在Python中怎樣安裝詞云
初級(jí)會(huì)計(jì)職稱中級(jí)會(huì)計(jì)職稱經(jīng)濟(jì)師注冊(cè)會(huì)計(jì)師證券從業(yè)銀行從業(yè)會(huì)計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級(jí)會(huì)計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評(píng)估師國(guó)際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級(jí)建造師二級(jí)建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測(cè)工程師建筑八大員注冊(cè)建筑師二級(jí)造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評(píng)價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會(huì)工作者司法考試職稱計(jì)算機(jī)營(yíng)養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級(jí)職稱護(hù)士資格證初級(jí)護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論