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

主站蜘蛛池模板: 好硬~好爽~别进去~动态图, 69式真人无码视频免 | 亚洲AV无码乱码在线观看性色扶| 亚洲av无码精品网站| 亚洲精品偷拍无码不卡av| 日韩精品无码区免费专区 | 亚洲AV无码久久精品蜜桃| 成人免费午夜无码视频| 夜夜添无码一区二区三区| 特级毛片内射www无码| 日韩午夜福利无码专区a| 国产日韩AV免费无码一区二区| 亚洲精品无码久久久久秋霞| 亚洲国产精品无码专区影院| 国产成人无码免费视频97| 无码国产精品一区二区免费虚拟VR| 久久久无码精品亚洲日韩软件| 亚洲av日韩aⅴ无码色老头| 久久亚洲精品无码| 亚洲精品无码久久一线| 国产成人无码a区在线视频| 免费无遮挡无码视频网站| 无码日韩精品一区二区免费| 日木av无码专区亚洲av毛片| 亚洲国产成人精品无码区在线观看 | 亚洲AV人无码激艳猛片| 中文字幕无码精品亚洲资源网| 国产久热精品无码激情| 亚洲av永久无码精品秋霞电影秋 | 无码中文字幕一区二区三区| 青青草无码免费一二三区| 无码中文字幕日韩专区视频| 国产AV无码专区亚洲AVJULIA| 国产午夜无码精品免费看| 自拍中文精品无码| 亚洲日韩精品无码专区网址| 亚洲日韩v无码中文字幕| 国产午夜无码精品免费看| 亚洲日韩精品一区二区三区无码 | 在线看无码的免费网站| 亚洲熟妇无码爱v在线观看| 亚洲成av人无码亚洲成av人|