返回頂部
關閉軟件導航
位置:首頁 > 技術分享 > 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代碼性能優化技巧分享 這篇文章對您有用,請分享給您的好友,謝謝!

主站蜘蛛池模板: 亚洲国产成人精品无码区花野真一| 国产精品爽爽va在线观看无码| 无码福利写真片视频在线播放| 久久久久无码精品| 18禁超污无遮挡无码免费网站| 十八禁无码免费网站| 国产福利无码一区在线| 成人无码区免费A∨直播| 色综合久久久久无码专区| 亚洲精品偷拍无码不卡av| 精品人妻少妇嫩草AV无码专区| 无码播放一区二区三区| 国产精品成人无码久久久久久 | 亚洲午夜无码久久| 亚洲精品无码成人片久久| 国产成人无码aa精品一区| 无码人妻精品一区二区三| 亚洲国产综合无码一区二区二三区| 亚洲AV日韩AV永久无码色欲| 中文字幕丰满乱子伦无码专区| 亚洲av永久中文无码精品综合| 精品久久久久久久无码| 久久亚洲AV成人出白浆无码国产 | 亚洲中文字幕无码久久2020| 久久亚洲精品中文字幕无码| 亚洲午夜福利精品无码| 亚洲高清无码综合性爱视频| 色欲AV无码一区二区三区| 波多野结衣VA无码中文字幕电影| 色综合久久久无码网中文| 久久午夜福利无码1000合集| 亚洲乱码无码永久不卡在线| 国产在线精品无码二区| 亚洲AV无码码潮喷在线观看| 国产亚洲人成无码网在线观看| 国产在线观看无码免费视频 | 国产精品JIZZ在线观看无码| 无码人妻精品一区二区三区9厂 | 人妻精品久久无码区洗澡| 亚洲av午夜国产精品无码中文字| 亚洲Av无码国产一区二区 |