昨天同事在review程式碼的時候,給我show了另一個同事寫的神一樣的python程式碼,基本上是list comprehension加巨複雜的filter,外加正規表示式,以及一個generator函式,並且在那個generator函式上還加了一個decorator,同事其實也寫了幾年python了,在review的時候還是隻能一邊讀程式碼,一邊查語法手冊。我大概看了下,貌似是為了實現一個讀檔案並解析的功能。
我並不太清楚裡面太多的細節,只是覺得如果一件事情可以用簡單的,順序的程式碼完成的,那就別用一些太炫的技巧,什麼回撥、物件、模式都會帶來一定的複雜性,提高編寫、閱讀和維護的成本,所以在你用牛刀的時候,保證躺在你刀下的是一頭牛,而不是一隻雞,不然,成本太高。
然後,又發現其在搜尋一個字串的時候,直接用了re.search,而不是簡單直觀的string.find,明顯反直觀,和同事說了下,他說不一定,誰知道re.search做了什麼優化,導致他比string.search快,問題是一個複雜的演算法,再優化也很難打敗一個簡單的演算法,string.find是一個極其簡單的線性演算法,況且,你re.search可以優化,string.find也可以啊,測一下就知道了:
In [16]: str = 'use time.time to measure the time, which is the default on Unix : use time.time to measure the time, which is the default on Unix' In [17]: timeit str.find(':') 1000000 loops, best of 3: 388 ns per loop In [18]: timeit re.search(':', str) 100000 loops, best of 3: 2.06 us per loop
明顯str.find要快將近5倍。
所以很贊同一句話,學從難處學,用從易處用