翻譯,兩篇博文 Quick Python Performance Optimization一 二, 很短
第一篇
僅是解釋,如何用正確並且高效的方式完成在日常Python編碼中簡單的事情
1.在ipython互動shell中使用%timeit (per line) 和 %prun (cProfile)
測量你的程式碼,並且找到效能的瓶頸.這和”過早優化是一切罪惡的根源”並不矛盾.這是第一級的效能優化,而不是重量級的效能優化序列.
更多的測量Python程式碼效能,可參考 http://www.huyng.com/posts/python-performance-analysis/
另一個有趣的庫,line_profiler,逐行的效能測量https://bitbucket.org/robertkern/line_profiler
2.減少函式呼叫次數.如果你需要處理一個列表,傳遞整個列表,而不是遍歷列表,呼叫函式傳遞每個元素並獲取返回值
3.使用xrange代替range
xrange是range的C語言實現–更高效的記憶體使用.
4.對於大資料,使用numpy, 效能優於標準資料結構
5.使用””.join(string) 代替字串 + 或 +=
6.while 1 比 while True 快
7.效能: 列表解析 > for 迴圈 > while 迴圈
遍歷list時,列表解析效能最優,while迴圈最差(需要一個外部計數器)
8.使用 cProfile, cStringIO 和 cPickle
總是使用模組可用的C版本
9.使用區域性變數
區域性變數效能優於全域性變數,內建變數及屬性查詢
10.存在序列和對待器版本- 迭代物件記憶體更優. 使用 itertools
儘可能的建立生成器和使用yield.相對於常規序列實現方式,效能更優
http://www.diveinto.org/python3/iterators.html
http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained 中文翻譯
第二篇
11.在適用的場景中儘可能地使用map,reduce,filter替代for迴圈
12.檢查元素歸屬 ‘a in b’, dict或set 優於list/tuple.
13.處理大資料時,儘可能使用不可變資料型別,更快 – tuples > list
14.插入list的複雜度是O(n)
15.如果你需要操作序列的開始和結束,使用deque
16.del – 使用後刪除無用物件
1 2 3 |
Python自身可以執行,通過gc模組,或者 在物件的魔術方法中寫入__del__方法,或者 最簡單的方式,使用後del刪除 |
17.使用time.clock()
18.GIL(http://wiki.python.org/moin/GlobalInterpreterLock) – GIL is a demon.
GIL允許每個程式中執行一個python本地執行緒,防止CPU級別的並行. 嘗試使用ctypes和原生c庫來解決這個問題. 當你無法用Python進一步進行優化的時候.記住,你還有一種選擇,使用原生C實現效能糟糕的函式,並且通過Python c繫結呼叫. 其他庫,例如gevent,同樣可以解決這個問題,並且某些擴充套件非常成功
TL,DR: 在寫程式碼時,考慮一圈:資料結構,構造迭代,內建函式和必要情況下使用GIL構造C擴充套件
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式