本人翻譯自《Exper Python Programming》
'Premature optimization is the root of all evil in programming' -Donald Knuth
?
? ?優化的三原則 ? ??
- 讓它跑起來先
一個非常常見的錯誤就是在編寫代碼之初我們就開始對代碼進行優化。讓人傷心的是這通常做的都是無用功,很多軟件只有你跑起來了才會發現它真正的瓶頸在哪里。
- 站在用戶的視角看問題
曾經有一個團隊為了自己的項目跑起來更快加班加點最終達到了自己滿意的效果,最終交付到客戶那里,結果發現客戶并不覺得跑得快對他有什么好處。。。
- 始終保持代碼可讀(可維護)
如果當你已經完成了90%的優化任務,而剩下10%的優化任務可能會使你的代碼完全的不可讀,那這個時候你最好可以停止你的優化工作了。
?
? ?優化的策略 ? ? ?
- 去找別人的問題
通常情況下我們的軟件測試不可能做到100%的模擬真實環境。當客戶向我們抱怨軟件運行速度不如從前時,我們不妨找找是不是因為在和別的應用進行交互時候,其他應用造成的速度問題。
- 刷硬件
這個大家都好懂,跑的慢?先看看是不是你配置不夠啊,不夠就買買買!
- 編寫一個速度測試文檔
當我們開始優化工作的時候,我們不妨在我們的目標函數下面寫一條注釋“該函數運行時間不能超過1秒”
?
? ?尋找瓶頸 ? ? ? ?
- 查看CPU使用率
從CPU的角度來看呢,又分為宏觀查找和微觀查找。這里最常用的是cProfile,它是一個c語言的庫,提供對程序資源使用的監控還有時間的記錄。具體的使用方法可以點這里。
- 查看內存使用率
既然說的是python,我們也就不得不提到python的內存分配機制,不像c語言那樣,我們可以使用一個函數就知道當前變量的內存分配情況,而在python中我們是絕不會知道某個變量當前分配了多少內存空間的。。通常情況下,消耗內存空間的原因有:1.某個變量不受控制的增長;2.在全局有太多的實例,而且沒有監控他們對內存的使用;3.沒有正確關閉的線程;4.有__del__屬性的對象在一個循環體內
具體的內存檢測工具有:Guppy、Heapy
- 查看網絡使用率?
這一部分的話我們使用通用的網絡監測工具就好了。
? ?降低代碼復雜度 ???
? 兩個維度:
- 測量分支復雜度:程序中ifelse語句的分支有多少
- 測量時間空間復雜度
?
最后兩個大主題是:多線程和緩存。這兩個方法也是非常重要的優化程序的方法,先寫到這里,看完繼續更。