1.for 循環(huán)
我們大部分的時(shí)候代碼里面都有for循環(huán),然后里面嵌套一段邏輯處理,下面有兩種方法來(lái)完成: 二者的性能差距有多大呢,一般我們用內(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ì)于這樣的情況,可以優(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)銷,從而提高性能。
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ī)訪問(wèn)操作,那么list會(huì)快一些。
2).缺省字典defaultdict
對(duì)于字典的使用,我們要學(xué)會(huì)用defaultdict來(lái)代替,一來(lái)是因?yàn)橛腥笔≈捣浅0踩?,如果訪問(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í)寫代碼的時(shí)候,能多一份思考,代碼不僅能work還能提升性能,相信你經(jīng)常這樣思考,慢慢的就會(huì)成為高手啦!
最后
作為一個(gè)IT的過(guò)來(lái)人,我自己整理了一些python學(xué)習(xí)資料,都是別人分享給我的,希望對(duì)你們有幫助。 學(xué)好 Python 不論是就業(yè)還是做副業(yè)賺錢都不錯(cuò),但要學(xué)會(huì) Python 還是要有一個(gè)學(xué)習(xí)規(guī)劃。
|