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

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

1.字符串

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

  • join的恰當使用
  • ""%()
  • 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()
#變量相加過多時此方法較優(yōu),反之較差

2.循環(huán)

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

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

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

在循環(huán)中盡量避免 .(點號操作符)的使用,因為這往往會增加調(diào)用開銷
避免

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ù)中盡量使用局部變量,因為調(diào)用解釋器會先搜索局部變量再搜索全局變量

避免

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.字典

針對無初值的情況進行優(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容