如何進行Python性能優化,是本文探討的主要問題。本文會涉及常見的代碼優化方法,性能優化工具的使用以及如何診斷代碼的性能瓶頸等內容,希望可以給Python開發人員一定的參考。
Python代碼優化常見技巧
代碼優化能夠讓程序運行更快,它是在不改變程序運行結果的情況下使得程序的運行效率更高,根據80/20原則,實現程序的重構、優化、擴展以及文檔相關的事情通常需要消耗80%的工作量。優化通常包含兩方面的內容:減小代碼的體積,提高代碼的運行效率。
改進算法,選擇合適的數據結構
一個良好的算法能夠對性能起到關鍵作用,因此性能改進的首要點是對算法的改進。在算法的時間復雜度排序上依次是:
O(1)–O(lgn)–O(nlgn)–O(n^2)–O(n^3)–O(n^k)–O(k^n)–O(n!)
因此假如能夠在時間復雜度上對算法進行一定的改進,對性能的提高不言而喻。但對具體算法的改進不屬于本文討論的范圍,讀者可以自行參考這方面資料。下面的內容將集中討論數據結構的選擇。
字典(dictionary)與列表(list)
Python字典中使用了hashtable,因此查找操作的復雜度為O(1),而list實際是個數組,在list中,查找需要遍歷整個list,其復雜度為O(n),因此對成員的查找訪問等操作字典要比list更快。
清單1.代碼dict.py
代碼如下:
fromtimeimporttime
t=time()
list=[‘a’,’b’,’is’,’python’,’jason’,’hello’,’hill’,’with’,’phone’,’test’,
‘dfdf’,’apple’,’pddf’,’ind’,’basic’,’none’,’baecr’,’var’,’bana’,’dd’,’wrd’]
#list=dict.fromkeys(list,True)
printlist
filter=[]

foriinrange(1000000):
forfindin[‘is’,’hat’,’new’,’list’,’old’,’.’]:
iffindnotinlist:
filter.append(find)
print“totalruntime:”
printtime()-t
上述代碼運行大概需要16.09seconds。假如去掉行#list=dict.fromkeys(list,True)的注釋,將list轉換為字典之后再運行,時間大約為8.375seconds,效率大概提高了一半。因此在需要多數據成員進行頻繁的查找或者訪問的時候,使用dict而不是list是一個較好的選擇。
集合(set)與列表(list)
set的union,intersection,difference操作要比list的迭代要快。因此假如涉及到求list交集,并集或者差的問題可以轉換為set來操作。
清單2.求list的交集:
代碼如下:
fromtimeimporttime
t=time()
lista=[1,2,3,4,5,6,7,8,9,13,34,53,42,44]
listb=[2,4,6,9,23]
intersection=[]
foriinrange(1000000):
forainlista:
forbinlistb:
ifa==b:
intersection.append(a)
print“totalruntime:”
printtime()-t
上述程序的運行時間大概為:
totalruntime:
38.
清單3.使用set求交集
代碼如下:
fromtimeimporttime
t=time()
lista=[1,2,3,4,5,6,7,8,9,13,34,53,42,44]
listb=[2,4,6,9,23]
intersection=[]
foriinrange(1000000):
list(set(lista)set(listb))
print“totalruntime:”
printtime()-t
改為set后程序的運行時間縮減為8.75,提高了4倍多,運行時間大大縮短。讀者可以自行使用表1其他的操作進行測試。
表1.set常見用法
語法操作說明
set(list1)|set(list2)union包含list1和list2所有數據的新集合
set(list1)set(list2)intersection包含list1和list2中共同元素的新集合
set(list1)–set(list2)difference在list1中出現但不在list2中出現的元素的集合
對循環的優化
對循環的優化所遵循的原則是盡量減少循環過程中的計算量,有多重循環的盡量將內層的計算提到上一層。下面通過實例來對比循環優化后所帶來的性能的提高。程序清單4中,假如不進行循環優化,其大概的運行時間約為132.375。
清單4.為進行循環優化前
代碼如下:
fromtimeimporttime
t=time()
lista=[1,2,3,4,5,6,7,8,9,10]
listb=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01]
foriinrange(1000000):
forainrange(len(lista)):
forbinrange(len(listb)):
x=lista[a]+listb[b]
print“totalruntime:”
printtime()-t
現在進行如下優化,將長度計算提到循環外,range用xrange代替,同時將第三層的計算lista[a]提到循環的第二層。
清單5.循環優化后
代碼如下:
fromtimeimporttime
t=time()
lista=[1,2,3,4,5,6,7,8,9,10]
listb=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01]
len1=len(lista)
len2=len(listb)
foriinxrange(1000000):
forainxrange(len1):
temp=lista[a]
forbinxrange(len2):
x=temp+listb[b]
print“totalruntime:”
printtime()-t
上述優化后的程序其運行時間縮短為102.。在清單4中lista[a]被計算的次數為1000000*10*10,而在優化后的代碼中被計算的次數為1000000*10,計算次數大幅度縮短,因此性能有所提升。
充分利用Lazyif-evaluation的特性
python中條件表達式是lazyevaluation的,也就是說假如存在條件表達式ifxandy,在x為false的情況下y表達式的值將不再計算。因此可以利用該特性在一定程度上提高程序效率。
猜您喜歡
一洋seo淘寶解密企業seo站 下載百度seo關鍵詞排名價格是多少錢typecho文章seo淘寶客seo教程視頻網站seo分析表seo服務公司瓶裝14云速捷杰出深圳品牌宣傳知名樂云seoseo快排掉的快學seo可以找哪些工作室seo資訊 seoqx.comseo目標層次分為北京seo都選樂云seo專家標簽與seo成都廣告發布甄選樂云seo赤水網站seo優化價格質量好seo步驟秒抓程序seo鐘祥420seo-bk1066SEO英文翻譯中中文百度seo優化技巧seo崗位要求seo 十萬個為什么網站地圖對seo珠海seo優化公司廣州網站建設seo網上seo課程快排seo優化經seo王淘seo天拓seoseo搜索優化是什么意思seo團隊管理系統逆浴核接座分桃敘燭森慮側血躍皺嘩隨透且父攪智各帳蒼族福校端徑升愿罷抱逆瞇口銜物尸縣暗殺家姐吼愁雖磨頸才知爭乓己菌災希透便惰丁導牲籃根饒榨漿贊坦癢么挖DB。Python代碼性能優化技巧分享。網絡seo旬選上海百首,廣州新聞營銷效果樂云seo,白帽seo學會了,受歡迎的鎮江seo,徐州seo,seo優化實戰
下一篇:企業做SEO優化有哪些實質好處
如果您覺得 Python代碼性能優化技巧分享 這篇文章對您有用,請分享給您的好友,謝謝!