快速Python效能優化要點

wklken發表於2015-12-15

翻譯,兩篇博文 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 – 使用後刪除無用物件

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擴充套件

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

快速Python效能優化要點 快速Python效能優化要點

相關文章