python性能優(yōu)化指南

本文用以記錄在python開(kāi)發(fā)中遇到的性能提高技巧
持續(xù)更新中...

1.字符串

在python中string對(duì)象是不可變的,而字符串的相加會(huì)產(chǎn)生新的字符串。
當(dāng)需要迭代生成一個(gè)長(zhǎng)字符串時(shí)逐一相加不僅會(huì)影響速度也會(huì)而外增加內(nèi)存消耗(如中間結(jié)果战秋,參考java StringBuffer), 但是當(dāng)僅需鏈接很少的字符串時(shí)join方法未必明智

  • join的恰當(dāng)使用
  • ""%()
  • format比較慢

避免

s = ""
for x in list1:
    s += x

推薦

s.join(list1)

避免

s = ""
for x in list1:
    s += fun(x)

推薦

list2 = [ fun(x) for x in list1 ]
s = "".join(list2)

避免

out = "<html>" + head + prologue + query + tail + "</html>"

建議

out = "<html>%(head)s%(prologue)s%(query)s%(tail)s</html>" % locals()
#變量相加過(guò)多時(shí)此方法較優(yōu)百侧,反之較差

2.循環(huán)

python解釋器在解釋for循環(huán)時(shí)會(huì)有較大的性能損耗介却,如果可以建議多使用列表解析來(lái)代替for循環(huán),另外迭代器也在優(yōu)化時(shí)間外還能夠減少內(nèi)存開(kāi)銷,在調(diào)用自寫函數(shù)時(shí)map也會(huì)提高程序性能

newlist = [s.upper() for s in oldlist]

iterator = (s.upper() for s in oldlist)
newlist = list(iterator)

在循環(huán)中盡量避免 .(點(diǎn)號(hào)操作符)的使用谴供,因?yàn)檫@往往會(huì)增加調(diào)用開(kāi)銷
避免

newlist = []
for x in oldlist:
    newlist.append(x.upper())

建議

newlist = []
append = newlist.append
upper = str.upper
for x in oldlist:
    append(upper(x))

3.變量

在函數(shù)中盡量使用局部變量,因?yàn)檎{(diào)用解釋器會(huì)先搜索局部變量再搜索全局變量

避免

def f1():
    newlist = []
    append = newlist.append
    upper = str.upper
    global oldlist
    for x in oldlist:
        append(tool1(x))
    return newlist

建議

def f2(oldlist):
    newlist = []
    append = newlist.append
    for x in oldlist:
        append(tool1(x))
    return newlist

4.字典

針對(duì)無(wú)初值的情況進(jìn)行優(yōu)化(提升并不多20%左右齿坷,但在一定程度上降低了可讀性)

原始方法

def f5(oldlist):
    d = {}
    for string in oldlist:
        if string not in d:
            d[string] = 0
        else:
            d[string] += 1

優(yōu)化方法

def f6(oldlist):
    d = {}
    for string in oldlist:
        try:
            d[string] += 1
        except KeyError:
            d[string] = 0
            
from collections import defaultdict
def f8(oldlist):
    d = defaultdict(int)
    for string in oldlist:
        d[string] += 1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末憔鬼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胃夏,更是在濱河造成了極大的恐慌,老刑警劉巖昌跌,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仰禀,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蚕愤,警方通過(guò)查閱死者的電腦和手機(jī)答恶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)萍诱,“玉大人悬嗓,你說(shuō)我怎么就攤上這事≡7唬” “怎么了包竹?”我有些...
    開(kāi)封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我周瞎,道長(zhǎng)苗缩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任声诸,我火速辦了婚禮酱讶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彼乌。我一直安慰自己泻肯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布慰照。 她就那樣靜靜地躺著灶挟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焚挠。 梳的紋絲不亂的頭發(fā)上膏萧,一...
    開(kāi)封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蝌衔,去河邊找鬼榛泛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛噩斟,可吹牛的內(nèi)容都是我干的曹锨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剃允,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沛简!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起斥废,我...
    開(kāi)封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤椒楣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后牡肉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捧灰,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年统锤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毛俏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饲窿,死狀恐怖煌寇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逾雄,我是刑警寧澤阀溶,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布腻脏,位于F島的核電站,受9級(jí)特大地震影響淌哟,放射性物質(zhì)發(fā)生泄漏迹卢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一徒仓、第九天 我趴在偏房一處隱蔽的房頂上張望腐碱。 院中可真熱鬧,春花似錦掉弛、人聲如沸症见。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谋作。三九已至,卻和暖如春乎芳,著一層夾襖步出監(jiān)牢的瞬間遵蚜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工奈惑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吭净,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓肴甸,卻偏偏與公主長(zhǎng)得像寂殉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子原在,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)友扰,也就是一...
    悟名先生閱讀 4,131評(píng)論 0 13
  • 〇、前言 本文共108張圖庶柿,流量黨請(qǐng)慎重村怪! 歷時(shí)1個(gè)半月,我把自己學(xué)習(xí)Python基礎(chǔ)知識(shí)的框架詳細(xì)梳理了一遍浮庐。 ...
    Raxxie閱讀 18,931評(píng)論 17 410
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,557評(píng)論 1 118
  • 轉(zhuǎn) # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    呂品?閱讀 9,709評(píng)論 0 44
  • 一实愚、西方的節(jié)日情人節(jié)來(lái)到啦! 二兔辅、前兩天介紹了視覺(jué)元素的搜集,臨摹击喂、組合维苔,今天我們來(lái)到了視覺(jué)元素運(yùn)用的第三階段借鑒...
    up方方閱讀 508評(píng)論 0 0