90%的人說(shuō)Python程序慢,5大神招讓你的代碼像賽車(chē)一樣跑起來(lái)
很多人抱怨說(shuō)自己寫(xiě)的Python代碼跑的慢,尤其是當(dāng)處理的數(shù)據(jù)集比較大的時(shí)候,其實(shí)稍微改動(dòng)幾行代碼就可以讓你的代碼性能提高好幾倍,不信一起來(lái)看下面這個(gè)5個(gè)小技巧。
1.for 循環(huán)
二者的性能差距有多大呢,一般我們用內(nèi)置的timeit模塊來(lái)量化比較:
把傳統(tǒng)的for改成推導(dǎo)列表,高下立判,性能提高了很多,提升了200%
2.用set而不用list
我們?cè)賮?lái)看一個(gè)常見(jiàn)的場(chǎng)景,搜索性能的時(shí)候用set是列表10倍,不信看下面這個(gè)例子
原因搜索成員的時(shí)候,Python的set比list快很多。差距就在if i in mylist 和if i in myset。列表的復(fù)雜度是O(n),而集和的復(fù)雜度是O(1),搜索起來(lái)肯定是set快!
3.交換if和for的位置
很多時(shí)候,我們是在for循環(huán)內(nèi)部進(jìn)行條件判斷,循環(huán)一個(gè)變量,然后用if/else進(jìn)行判斷。對(duì)于這樣的情況,可以?xún)?yōu)化一下,把if/else提到for循環(huán)外邊,也可以提高性能。
4.巧妙的用try/except語(yǔ)句
很多時(shí)候在一個(gè)for循環(huán)內(nèi)部,對(duì)i進(jìn)行計(jì)算,然后添加到一個(gè)list里面,如果能巧妙地利用try/except,可以擺脫對(duì)if/else檢查的開(kāi)銷(xiāo),從而提高性能。
5.神器collection模塊
collection庫(kù)提供了很多模塊,這些模塊非常有用,有一些模塊是跟容器有關(guān),大部分的實(shí)戰(zhàn)項(xiàng)目我們都會(huì)用到。比如deque雙向隊(duì)列和defaultdict缺省字典。
1).雙向隊(duì)列deque
deque是雙向隊(duì)列,如果你的業(yè)務(wù)邏輯里面需要大量的從隊(duì)列的頭或者尾部刪除,添加,用deque的性能會(huì)大幅提高!如果只是小隊(duì)列,并且對(duì)元素需要隨機(jī)訪(fǎng)問(wèn)操作,那么list會(huì)快一些。
2).缺省字典defaultdict
對(duì)于字典的使用,我們要學(xué)會(huì)用defaultdict來(lái)代替,一來(lái)是因?yàn)橛腥笔≈捣浅0踩?,如果訪(fǎng)問(wèn)不存在的key,不會(huì)報(bào)錯(cuò);二來(lái)是Pyhon性能會(huì)大幅提高。
僅僅換了字典數(shù)據(jù)結(jié)構(gòu),性能就大幅的提高了3倍。
Python里面的技巧還是很多的,尤其是性能優(yōu)化這塊,Py3已經(jīng)比Py2性能上高了許多,如果我們?cè)谄綍r(shí)寫(xiě)代碼的時(shí)候,能多一份思考,代碼不僅能work還能提升性能,相信你經(jīng)常這樣思考,慢慢的就會(huì)成為高手啦!當(dāng)然很多新手經(jīng)常不得法,可以看看這個(gè)捷徑。