漫畫 | 假裝自己是Python高手,學會這十招就可以
Python是一門簡單易學,而且功能非常強大的語言,目前是火的一大糊涂,據說除了生孩子啥都干。但是Python有一個很致命的問題就是慢,看下面兩個人都吵起來:
01.招數一
在列表里面計數
性能:第二種計數方法比第一種快6290倍,為啥因為Python原生的內置函數都是優化過的,所以能用原生的計算的時候,盡量用原生的函數來計算。
02.招數二
過濾一個列表
性能:第二種方法比第一種慢近50%,有人可能覺得filter應該會快一些,其實filter增加了復雜度,返回一個迭代對象再用list轉化為一個列表,所以開銷大一些。其實最快是推導列表,比第一種性能提高近30%。
03.招數三
善用異常,事半功倍
性能:第二種比第一種快了近3倍,簡單粗暴直接用異常,而第一種會通過內置函數hasattr來先檢查,查找內部類的屬性,增加了開銷。
04.招數四
列表成員檢查
性能:第二種比第一種快了1倍,直接用in這樣的方法檢查列表內部成員比遍列要快很多的。當然如果你的num是在列表的頭部,搜索會更快!
05.招數五
去重
性能:第二種比第一種快了近400倍,所以能用原生的內置的數據結構,一定要用原生的。不過相信大部分同學去重都開始用set了。
06.招數六
列表的排序
性能:第二種比第一種快了近6倍,sorted函數會把原來的列表進行排序然后再返回一個新的列表,而sort函數直接再原來的列表上面排序,節省了開銷。
07.招數七
把迭代循環放到函數里面
性能:第二種要比第一種快了20%多,原因是因為把重復的循環直接放到了一次性的塞入函數,要把你調用1000次函數開銷小很多。
08.招數八
檢查是否為True
性能:最快的是第三種(直接用if)比第一種快了60%,不需要用借助==和is來進行判斷。因為==會調用內置的魔法函數__eq__來比較左右兩邊的類型,而直接用if來判斷var是否為空,None,空的列表,字典會快很多。
09.招數九
檢查列表是否為空
性能:第三種最快,第三種比第一種快了3倍;其實大部人新手都喜歡用len來判斷,其實我也是,這個習慣要改。
10.最后一招
性能:沒有對比沒有傷害,因為Python一切皆對象,所以當你用list()生成一個對象的時候會產生開銷,而[]直接返回一個list,會快很多,同理dict也是一樣的。
大家可以反思一下自己的代碼里面有沒有上面這幾招的代碼,回去優化一下,會對你的性能有很大的提高?;蛘卟锁B也可以直接背下來,面試的時候也許可以假裝一把高手。