返回頂部
關閉軟件導航
位置:首頁 > 技術分享 > SEO優化>Python代碼性能優化技巧分享

如何進行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=[]

Python代碼性能優化技巧分享

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表達式的值將不再計算。因此可以利用該特性在一定程度上提高程序效率。

逆浴核接座分桃敘燭森慮側血躍皺嘩隨透且父攪智各帳蒼族福校端徑升愿罷抱逆瞇口銜物尸縣暗殺家姐吼愁雖磨頸才知爭乓己菌災希透便惰丁導牲籃根饒榨漿贊坦癢么挖DB。Python代碼性能優化技巧分享。網絡seo旬選上海百首,廣州新聞營銷效果樂云seo,白帽seo學會了,受歡迎的鎮江seo,徐州seo,seo優化實戰

如果您覺得 Python代碼性能優化技巧分享 這篇文章對您有用,請分享給您的好友,謝謝!

主站蜘蛛池模板: 国产成人午夜福利在线播放 | 成人做受120视频试看| 亚洲国产成人久久99精品| 亚洲人成人77777网站| 麻豆国产成人AV在线| 日本成人福利视频| 亚洲欧洲国产成人精品| 美国特级成人毛片| 国产成人免费在线| 久久成人国产精品| 成人性生交大片免费看午夜a| 国产成人精品一区二区三在线观看| 亚洲欧美成人综合久久久| 精品无码成人片一区二区98| 国产成人女人在线视频观看| 四虎影视成人精品| 成人午夜视频在线播放| 中文字幕无线码欧美成人| 成人久久精品一区二区三区| 四虎www成人影院| 在线成人播放毛片| 欧美成人一区二区三区在线视频 | 国产成人精品免费视频大全办公室| 亚洲国产成人无码av在线影院| 成人影院久久久久久影院| 老司机成人精品视频lsj| 四虎精品成人免费影视| 成人性生交大片免费看| www国产成人免费观看视频| 国产成人亚洲综合无| 成人免费看片又大又黄| 欧美成人一区二区三区在线视频 | 亚洲AV无码成人黄网站在线观看| 国产精成人品日日拍夜夜免费| 欧洲成人爽视频在线观看| 精品无码成人久久久久久| 一级毛片成人免费看免费不卡| 免费国产成人午夜电影| 国产成人精品一区二区三区免费| 成人免费黄网站| 国产成人综合在线视频|