本文摘自同行說用戶“春風(fēng)拂面”分享的文章局荚,原文鏈接:http://www.kuqin.com/shuoit/20150610/346517.html陵珍,如涉及版權(quán)問題請及時(shí)聯(lián)系小編嚷掠!
Python是一門優(yōu)秀的語言地粪,它能讓你在短時(shí)間內(nèi)通過極少量代碼就能完成許多操作。不僅如此宰译,它還輕松支持多任務(wù)處理檐蚜,比如多進(jìn)程。
不喜歡Python的人經(jīng)常會(huì)吐嘈Python運(yùn)行太慢沿侈。但是闯第,事實(shí)并非如此。嘗試以下六個(gè)竅門缀拭,來為你的Python應(yīng)用提速咳短。
竅門一:關(guān)鍵代碼使用外部功能包
Python簡化了許多編程任務(wù),但是對于一些時(shí)間敏感的任務(wù)蛛淋,它的表現(xiàn)經(jīng)常不盡人意诲泌。使用C/C++或機(jī)器語言的外部功能包處理時(shí)間敏感任務(wù),可以有效提高應(yīng)用的運(yùn)行效率铣鹏。這些功能包往往依附于特定的平臺(tái),因此你要根據(jù)自己所用的平臺(tái)選擇合適的功能包哀蘑。簡而言之诚卸,這個(gè)竅門要你犧牲應(yīng)用的可移植性以換取只有通過對底層主機(jī)的直接編程才能獲得的運(yùn)行效率。以下是一些你可以選擇用來提升效率的功能包:
這些功能包的用處各有不同绘迁。比如說合溺,使用C語言的數(shù)據(jù)類型,可以使涉及內(nèi)存操作的任務(wù)更高效或者更直觀缀台。Pyrex就能幫助Python延展出這樣的功能棠赛。Pylnline能使你在Python應(yīng)用中直接使用C代碼。內(nèi)聯(lián)代碼是獨(dú)立編譯的,但是它把所有編譯文件都保存在某處睛约,并能充分利用C語言提供的高效率鼎俘。
竅門二:在排序時(shí)使用鍵
Python含有許多古老的排序規(guī)則,這些規(guī)則在你創(chuàng)建定制的排序方法時(shí)會(huì)占用很多時(shí)間辩涝,而這些排序方法運(yùn)行時(shí)也會(huì)拖延程序?qū)嶋H的運(yùn)行速度贸伐。最佳的排序方法其實(shí)是盡可能多地使用鍵和內(nèi)置的sort()方法。譬如怔揩,拿下面的代碼來說:
在每段例子里捉邢,list都是根據(jù)你選擇的用作關(guān)鍵參數(shù)的索引進(jìn)行排序的。這個(gè)方法不僅對數(shù)值類型有效商膊,還同樣適用于字符串類型伏伐。
竅門三:針對循環(huán)的優(yōu)化
每一種編程語言都強(qiáng)調(diào)最優(yōu)化的循環(huán)方案。當(dāng)使用Python時(shí)晕拆,你可以借助豐富的技巧讓循環(huán)程序跑得更快藐翎。然而,開發(fā)者們經(jīng)常遺忘的一個(gè)技巧是:盡量避免在循環(huán)中訪問變量的屬性潦匈。譬如阱高,拿下面的代碼來說:
每次你調(diào)用str.upper, Python都會(huì)計(jì)算這個(gè)式子的值。然而茬缩,如果你把這個(gè)求值賦值給一個(gè)變量赤惊,那么求值的結(jié)果就能提前知道,Python程序就能運(yùn)行得更快凰锡。因此未舟,關(guān)鍵就是盡可能減小Python在循環(huán)中的工作量。因?yàn)镻ython解釋執(zhí)行的特性掂为,在上面的例子中會(huì)大大減慢它的速度裕膀。
(注意:優(yōu)化循環(huán)的方法還有很多,這只是其中之一勇哗。比如昼扛,很多程序員會(huì)認(rèn)為,列表推導(dǎo)式是提高循環(huán)速度的最佳方法欲诺。關(guān)鍵在于抄谐,優(yōu)化循環(huán)方案是提高應(yīng)用程序運(yùn)行速度的上佳選擇。)
竅門四:使用較新的Python版本
如果你在網(wǎng)上搜索Python扰法,你會(huì)發(fā)現(xiàn)數(shù)不盡的信息都是關(guān)于如何升級Python版本蛹含。通常,每個(gè)版本的Python都會(huì)包含優(yōu)化內(nèi)容塞颁,使其運(yùn)行速度優(yōu)于之前的版本浦箱。但是吸耿,限制因素在于,你最喜歡的函數(shù)庫有沒有同步更新支持新的Python版本酷窥。與其爭論函數(shù)庫是否應(yīng)該更新咽安,關(guān)鍵在于新的Python版本是否足夠高效來支持這一更新。
你要保證自己的代碼在新版本里還能運(yùn)行竖幔。你需要使用新的函數(shù)庫才能體驗(yàn)新的Python版本板乙,然后你需要在做出關(guān)鍵性的改動(dòng)時(shí)檢查自己的應(yīng)用。只有當(dāng)你完成必要的修正之后拳氢,你才能體會(huì)新版本的不同募逞。
然而,如果你只是確保自己的應(yīng)用在新版本中可以運(yùn)行馋评,你很可能會(huì)錯(cuò)過新版本提供的新特性放接。一旦你決定更新,請分析你的應(yīng)用在新版本下的表現(xiàn)留特,并檢查可能出問題的部分纠脾,然后優(yōu)先針對這些部分應(yīng)用新版本的特性。只有這樣蜕青,用戶才能在更新之初就覺察到應(yīng)用性能的改觀苟蹈。
竅門五:嘗試多種編碼方法
每次創(chuàng)建應(yīng)用時(shí)都使用同一種編碼方法幾乎無一例外會(huì)導(dǎo)致應(yīng)用的運(yùn)行效率不盡人意∮液耍可以在程序分析時(shí)嘗試一些試驗(yàn)性的辦法慧脱。譬如說,在處理字典中的數(shù)據(jù)項(xiàng)時(shí)贺喝,你既可以使用安全的方法菱鸥,先確保數(shù)據(jù)項(xiàng)已經(jīng)存在再進(jìn)行更新,也可以直接對數(shù)據(jù)項(xiàng)進(jìn)行更新躏鱼,把不存在的數(shù)據(jù)項(xiàng)作為特例分開處理氮采。請看下面第一段代碼:
當(dāng)一開始myDict為空時(shí),這段代碼會(huì)跑得比較快染苛。然而鹊漠,通常情況下,myDict填滿了數(shù)據(jù)茶行,至少填有大部分?jǐn)?shù)據(jù)贸呢,這時(shí)換另一種方法會(huì)更有效率。
在兩種方法中輸出結(jié)果都是一樣的拢军。區(qū)別在于輸出是如何獲得的。跳出常規(guī)的思維模式怔鳖,創(chuàng)建新的編程技巧能使你的應(yīng)用更有效率茉唉。
竅門六:交叉編譯你的應(yīng)用
開發(fā)者有時(shí)會(huì)忘記計(jì)算機(jī)其實(shí)并不理解用來創(chuàng)建現(xiàn)代應(yīng)用程序的編程語言。計(jì)算機(jī)理解的是機(jī)器語言。為了運(yùn)行你的應(yīng)用度陆,你借助一個(gè)應(yīng)用將你所編的人類可讀的代碼轉(zhuǎn)換成機(jī)器可讀的代碼艾凯。有時(shí),你用一種諸如Python這樣的語言編寫應(yīng)用懂傀,再以C++這樣的語言運(yùn)行你的應(yīng)用趾诗,這在運(yùn)行的角度來說,是可行的蹬蚁。關(guān)鍵在于恃泪,你想你的應(yīng)用完成什么事情,而你的主機(jī)系統(tǒng)能提供什么樣的資源犀斋。
Nuitka是一款有趣的交叉編譯器贝乎,能將你的Python代碼轉(zhuǎn)化成C++代碼。這樣叽粹,你就可以在native模式下執(zhí)行自己的應(yīng)用览效,而無需依賴于解釋器程序。你會(huì)發(fā)現(xiàn)自己的應(yīng)用運(yùn)行效率有了較大的提高虫几,但是這會(huì)因平臺(tái)和任務(wù)的差異而有所不同锤灿。
(注意:Nuitka現(xiàn)在還處在測試階段,所以在實(shí)際應(yīng)用中請多加注意辆脸。實(shí)際上但校,當(dāng)下最好還是把它用于實(shí)驗(yàn)。此外每强,關(guān)于交叉編譯是否為提高運(yùn)行效率的最佳方法還存在討論的空間始腾。開發(fā)者已經(jīng)使用交叉編譯多年,用來提高應(yīng)用的速度空执。記住浪箭,每一種解決辦法都有利有弊,在把它用于生產(chǎn)環(huán)境之前請仔細(xì)權(quán)衡辨绊。)
在使用交叉編譯器時(shí)奶栖,記得確保它支持你所用的Python版本。Nuitka支持Python2.6, 2.7, 3.2和3.3门坷。為了讓解決方案生效宣鄙,你需要一個(gè)Python解釋器和一個(gè)C++編譯器。Nuitka支持許多C++編譯器默蚌,其中包括Microsoft Visual Studio,MinGW和Clang/LLVM冻晤。
交叉編譯可能造成一些嚴(yán)重問題。比如绸吸,在使用Nuitka時(shí)鼻弧,你會(huì)發(fā)現(xiàn)即便是一個(gè)小程序也會(huì)消耗巨大的驅(qū)動(dòng)空間设江。因?yàn)镹uitka借助一系列的動(dòng)態(tài)鏈接庫(DDLs)來執(zhí)行Python的功能。因此攘轩,如果你用的是一個(gè)資源很有限的系統(tǒng)叉存,這種方法或許不太可行。
結(jié)論
前文所述的六個(gè)竅門都能幫助你創(chuàng)建運(yùn)行更有效率的Python應(yīng)用度帮。但是銀彈是不存在的歼捏。上述的這些竅門不一定每次都能奏效。在特定的Python的版本下笨篷,有的竅門或許比其他的表現(xiàn)更好瞳秽,但這有時(shí)候甚至取決于平臺(tái)的差異。你需要總結(jié)分析你的應(yīng)用冕屯,找到它效率低下的部分寂诱,然后嘗試這些竅門,找到解決問題的最佳方法安聘。
團(tuán)隊(duì)開發(fā)了一款工程師痰洒、產(chǎn)品經(jīng)理必備神器【同行說】APP,找大牛浴韭、看最新最熱干貨丘喻,勾搭妹紙,快來同行說吧念颈!