提高Python運(yùn)行效率的六個(gè)竅門

本文摘自同行說用戶“春風(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)行效率。以下是一些你可以選擇用來提升效率的功能包:

Cython

Pylnlne

PyPy

Pyrex

這些功能包的用處各有不同绘迁。比如說合溺,使用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,MinGWClang/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,找大牛浴韭、看最新最熱干貨丘喻,勾搭妹紙,快來同行說吧念颈!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泉粉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子榴芳,更是在濱河造成了極大的恐慌嗡靡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窟感,死亡現(xiàn)場離奇詭異讨彼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柿祈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門哈误,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躏嚎,你說我怎么就攤上這事蜜自。” “怎么了卢佣?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵重荠,是天一觀的道長。 經(jīng)常有香客問我虚茶,道長戈鲁,這世上最難降的妖魔是什么尾膊? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮荞彼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘待笑。我一直安慰自己鸣皂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布暮蹂。 她就那樣靜靜地躺著寞缝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仰泻。 梳的紋絲不亂的頭發(fā)上荆陆,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音集侯,去河邊找鬼被啼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棠枉,可吹牛的內(nèi)容都是我干的浓体。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼辈讶,長吁一口氣:“原來是場噩夢啊……” “哼命浴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贱除,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤生闲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后月幌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍讯,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年飞醉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冲茸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缅帘,死狀恐怖轴术,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钦无,我是刑警寧澤逗栽,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站失暂,受9級特大地震影響彼宠,放射性物質(zhì)發(fā)生泄漏鳄虱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一凭峡、第九天 我趴在偏房一處隱蔽的房頂上張望拙已。 院中可真熱鬧,春花似錦摧冀、人聲如沸倍踪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽建车。三九已至,卻和暖如春椒惨,著一層夾襖步出監(jiān)牢的瞬間缤至,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工康谆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留领斥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓秉宿,卻偏偏與公主長得像戒突,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子描睦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 竅門一:關(guān)鍵代碼使用外部功能包 Python簡化了許多編程任務(wù)膊存,但是對于一些時(shí)間敏感的任務(wù),它的表現(xiàn)經(jīng)常不盡人意忱叭。...
    蝴蝶蘭玫瑰閱讀 383評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理隔崎,服務(wù)發(fā)現(xiàn),斷路器韵丑,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 網(wǎng)絡(luò)上已經(jīng)有nginx服務(wù)器搭建的文檔爵卒,為什么我還要寫呢?啊哈撵彻!因?yàn)槊總€(gè)人得環(huán)境不一樣沒問題不一樣钓株,所以寫這篇文章...
    Author_z閱讀 5,214評論 2 0
  • 近期,互聯(lián)網(wǎng)圈的發(fā)生的一件事引起人們熱議陌僵,就是原點(diǎn)點(diǎn)網(wǎng)和啪啪創(chuàng)始人許朝軍涉賭被捕轴合,他在北京一處茶樓內(nèi)開設(shè)德州撲克局...
    毅菲閱讀 535評論 0 0