6個(gè)Python性能優(yōu)化技巧

Python是一門非常酷的語(yǔ)言,因?yàn)楹苌俚腜ython代碼可以在短時(shí)間內(nèi)做很多事情最岗,并且,Python很容易就能支持多任務(wù)和多重處理朝捆。

Python的批評(píng)者聲稱Python性能低效般渡、執(zhí)行緩慢,但實(shí)際上并非如此:嘗試以下6個(gè)小技巧芙盘,可以加快Pytho應(yīng)用程序驯用。


1、關(guān)鍵代碼可以依賴于擴(kuò)展包

Python使許多編程任務(wù)變得簡(jiǎn)單儒老,但是對(duì)于很關(guān)鍵的任務(wù)并不總是提供最好的性能蝴乔。使用C、C++或者機(jī)器語(yǔ)言擴(kuò)展包來(lái)執(zhí)行關(guān)鍵任務(wù)能極大改善性能驮樊。這些包是依賴于平臺(tái)的薇正,也就是說(shuō)片酝,你必須使用特定的、與你使用的平臺(tái)相關(guān)的包挖腰。簡(jiǎn)而言之,該解決方案提供了一些應(yīng)用程序的可移植性,以換取性能,您可以獲得只有通過(guò)直接向底層主機(jī)編程雕沿。下面這些擴(kuò)展包你可以考慮添加到你的個(gè)人擴(kuò)展庫(kù)中:

這些包有不同的作用和執(zhí)行方式。例如猴仑,Pyrex 讓Python處理一些內(nèi)存任務(wù)變得簡(jiǎn)單高效审轮;PyInline可以直接讓你在Python應(yīng)用程序中使用C代碼,雖然內(nèi)聯(lián)代碼被單獨(dú)編譯宁脊,但是如果你能高效的利用C代碼断国,它可以在同一個(gè)地方處理每一件事情。

2榆苞、使用關(guān)鍵字排序

有很多古老的Python代碼在執(zhí)行時(shí)將花費(fèi)額外的時(shí)間去創(chuàng)建一個(gè)自定義的排序函數(shù)。最好的排序方式是使用關(guān)鍵字和默認(rèn)的sort()方法霞捡,看看下面的示例:

import operator
somelist = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]
somelist.sort(key=operator.itemgetter(0))
somelist
#Output = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]
somelist.sort(key=operator.itemgetter(1))
somelist
#Output = [(6, 2, 4), (1, 5, 8), (9, 7, 5)]
somelist.sort(key=operator.itemgetter(2))
somelist
#Output = [(6, 2, 4), (9, 7, 5), (1, 5, 8)],

每一個(gè)案例的列表是根據(jù)你選擇作為關(guān)鍵字參數(shù)的索引排序的坐漏,這種方式對(duì)字符串和數(shù)字排序同樣適用。

3碧信、優(yōu)化循環(huán)

每一種編程語(yǔ)言都強(qiáng)調(diào)循環(huán)語(yǔ)句的優(yōu)化赊琳,Python也是一樣的。盡管你可以依賴于豐富的技術(shù)讓循環(huán)運(yùn)行的更快砰碴,然而躏筏,開(kāi)發(fā)者經(jīng)常忽略的一個(gè)方法是避免在循環(huán)內(nèi)部使用點(diǎn)拼接字符串。對(duì)于下面的示例:

lowerlist = ['this', 'is', 'lowercase']
upper = str.upper
upperlist = []
append = upperlist.append
for word in lowerlist:
    append(upper(word))
    print(upperlist)
    #Output = ['THIS', 'IS', 'LOWERCASE’]

每一次調(diào)用str.upper呈枉,Python都會(huì)去求這個(gè)方法的值趁尼。但是如果你把求值的結(jié)果放入一個(gè)變量中,就能提高程序的性能猖辫。這個(gè)關(guān)鍵是減少Python內(nèi)執(zhí)行的循環(huán)次數(shù),因?yàn)镻ython解析這些實(shí)例是比較慢的酥泞。

4、使用新版本

任何一個(gè)在線上搜索Python資料的人都會(huì)發(fā)現(xiàn)無(wú)數(shù)關(guān)于Python版本遷移的信息啃憎。通常芝囤,Python每一個(gè)版本都針對(duì)之前的一個(gè)版本做了優(yōu)化和改進(jìn),以讓Python運(yùn)行的更快辛萍。限制因素是你喜歡的函數(shù)庫(kù)是否也針對(duì)Python的新版本做了改進(jìn)悯姊。

當(dāng)你使用了新的函數(shù)庫(kù),獲得了Python的新版本贩毕,你需要保證代碼依然能夠運(yùn)行悯许,檢查應(yīng)用,修正差異耳幢。

然后岸晦,如果你僅僅是保證應(yīng)用能夠在新版本上運(yùn)行欧啤,你可能錯(cuò)過(guò)新功能的更新。一旦你做了改進(jìn)启上,在新版本下配置應(yīng)用程序邢隧,檢查問(wèn)題區(qū)域并優(yōu)先使用新功能更新,對(duì)于之前的升級(jí)冈在,用戶將看到更大性能的提升倒慧。

5、嘗試多種編程方法

每一次你創(chuàng)建應(yīng)用的時(shí)候包券,都使用同一種編程方法纫谅,在某些情況下降導(dǎo)致程序運(yùn)行會(huì)比預(yù)期的慢。在分析的過(guò)程中做一些小試驗(yàn)溅固。例如付秕,當(dāng)管理字典中的數(shù)據(jù)項(xiàng)時(shí),可以采用安全的方法確定數(shù)據(jù)項(xiàng)是否已經(jīng)存在并需要更新它侍郭,或者你可以直接添加條目,然后處理項(xiàng)目根本不存在的情況询吴。

n = 16
myDict = {}
for i in range(0, n):
    char = 'abcd'[i%4]
    if char not in myDict:
        myDict[char] = 0
        myDict[char] += 1
        print(myDict)

當(dāng)myDict是空時(shí),上述的代碼通常會(huì)運(yùn)行的更快亮元。但當(dāng)myDict已經(jīng)有數(shù)據(jù)填充時(shí)猛计,就有更好的方法可以選擇:

n = 16
myDict = {}
for i in range(0, n):
    char = 'abcd'[i%4]
    try:
        myDict[char] += 1
    except KeyError:
        myDict[char] = 1
    print(myDict)

兩種情況下都輸出{‘d’: 4, ‘c’: 4, ‘b’: 4, ‘a(chǎn)’: 4},唯一的差異是輸出是怎么獲得的爆捞。站在盒子外考慮和創(chuàng)建新的編程技巧都能讓你的程序獲得更快的運(yùn)行速度奉瘤。

6、交叉編譯程序

開(kāi)發(fā)者有時(shí)會(huì)忘記計(jì)算機(jī)不能識(shí)別任何一種現(xiàn)在應(yīng)用程序語(yǔ)言煮甥,它只識(shí)別機(jī)器代碼盗温。為了運(yùn)行程序,需要一個(gè)應(yīng)用將人類可讀的代碼轉(zhuǎn)換成計(jì)算機(jī)能識(shí)別的代碼苛秕。當(dāng)用一種語(yǔ)言寫(xiě)程序時(shí)肌访,例如Python,然后用另外一種語(yǔ)言來(lái)運(yùn)行它艇劫,例如C++吼驶,從性能角度看是有道理的。這個(gè)取決于你想要用這個(gè)應(yīng)用做什么和主機(jī)系統(tǒng)能夠提供什么資源店煞。

一個(gè)有趣的交叉編譯器蟹演,Nuitka, 能將Python轉(zhuǎn)換成C++代碼,結(jié)果是你可以再本機(jī)模式下執(zhí)行應(yīng)用顷蟀,而不是依賴于解釋器酒请。根據(jù)平臺(tái)和任務(wù)中,你可以看到顯著的性能提高。

譯文鏈接:http://www.ido321.com/1433.html

今年第六屆大會(huì)PyConChina2016鸣个,由PyChina.org發(fā)起羞反,CPyUG/TopGeek 等社區(qū)協(xié)辦布朦,將在2016年9月10日(上海)9月23日(深圳)10月15日(北京)地舉辦的針對(duì)Python開(kāi)發(fā)者所舉辦的最盛大和權(quán)威的Python相關(guān)技術(shù)會(huì)議,由PyChina社區(qū)主辦昼窗,致力于推動(dòng)各類Python相關(guān)的技術(shù)在互聯(lián)網(wǎng)是趴、企業(yè)應(yīng)用等領(lǐng)域的研發(fā)和應(yīng)用。

您可以點(diǎn)擊此處
了解更多詳情澄惊,或者掃描下圖二維碼:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唆途,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掸驱,更是在濱河造成了極大的恐慌肛搬,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毕贼,死亡現(xiàn)場(chǎng)離奇詭異温赔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鬼癣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門让腹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扣溺,你說(shuō)我怎么就攤上這事」衔睿” “怎么了锥余?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痢掠。 經(jīng)常有香客問(wèn)我驱犹,道長(zhǎng),這世上最難降的妖魔是什么足画? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任雄驹,我火速辦了婚禮,結(jié)果婚禮上淹辞,老公的妹妹穿的比我還像新娘医舆。我一直安慰自己,他們只是感情好象缀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布蔬将。 她就那樣靜靜地躺著,像睡著了一般央星。 火紅的嫁衣襯著肌膚如雪霞怀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天莉给,我揣著相機(jī)與錄音毙石,去河邊找鬼廉沮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徐矩,可吹牛的內(nèi)容都是我干的滞时。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丧蘸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漂洋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起力喷,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刽漂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后弟孟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贝咙,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年拂募,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庭猩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陈症,死狀恐怖蔼水,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情录肯,我是刑警寧澤趴腋,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站论咏,受9級(jí)特大地震影響优炬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厅贪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一蠢护、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧养涮,春花似錦葵硕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宣决,卻和暖如春蘸劈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尊沸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工威沫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贤惯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓棒掠,卻偏偏與公主長(zhǎng)得像孵构,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烟很,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,300評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理颈墅,服務(wù)發(fā)現(xiàn),斷路器雾袱,智...
    卡卡羅2017閱讀 134,702評(píng)論 18 139
  • Python是一個(gè)很酷的語(yǔ)言恤筛,因?yàn)槟憧梢栽诤芏痰臅r(shí)間內(nèi)利用很少的代碼做很多事情。不僅如此芹橡,它還能輕松地支持多任務(wù)毒坛,...
    蝴蝶蘭玫瑰閱讀 353評(píng)論 0 1
  • Copyright 2008 Google Inc. https://developers.google.com/...
    Mr_Shang閱讀 3,863評(píng)論 0 1
  • 《日本的八個(gè)審美意識(shí)》 關(guān)于作者 黑川雅之,被譽(yù)為開(kāi)創(chuàng)日本建筑和工業(yè)設(shè)計(jì)新時(shí)代的代表性人物林说。他成功地將東煎殷、西方審美...
    嘿喲喂喂閱讀 1,539評(píng)論 0 3