This is the Part II of Quick Python Performance Optimizations. 本文是 Python 性能優化二兩發的第二部分。
11. Use Map, Reduce and Filter instead of for loop where ever possible. 11. 儘量使用 Map,Reduce 和 Filter 替代 for 循環。
12. for checking 'a in b', dict or set is better than list/tuple. 12. 針對 'a in b' 的測試,b 是字典或者集合要好因而列表/元組的狀況。
13. while working with big amount of data, if possible use immutable datatypes, they are faster - tuples > list 13. 當針對大塊數據進行操做時,在可能的狀況下,使用不可變數據類型更好,由於它們會更快相應操做 - 元組 > 列表。
14. insertion into a list in O(n) complexity. 14. 向列表插入數據是 O(n) 複雜度的操做。
15. if you need manipulations on both ends of a list, use deque. 15. 若是你須要對列表的頭和尾都進行操做,請使用 deque 。
16. del - delete the objects after use -
Python does it by itself. But make sure of that with the gc module or
by writing an __del__ magic function or
the simplest way, del after use.
16. del - 在對象使用結束後進行刪除 -
Python 本身會進行該操做。可是請確認 gc 模塊處於正常工做狀態,或
本身寫一個 __del__ magic 函數,或
最簡單的方式,本身在用後本身刪除。
17. time.clock() 17. 使用 time.clock() 。
18. GIL(http://wiki.python.org/moin/GlobalInterpreterLock) - GIL is a demon. GIL allows only one python native thread to be run per process, preventing CPU level parallelism. Try using ctypes and native C libararies to overcome this. When even you reach the end of optimizing with python, always there exist an option of rewriting terribly slow functions in native C, and using it through python C bindings. Other libraries like gevent is also attacking the problem, and is successful to some extend. 18. GIL - GIL 是一個惡魔 GIL 只容許在每一個進程裏運行一個 python 本地線程,阻止了 CPU 級別的併發。可使用 ctypes 和純 C 庫來解決這個問題。就算到了優化 python 代碼的最後階段,仍舊能夠經過使用純 C 重寫慢速 python 函數來進行優化。或者乾脆直接使用 python 的 C 綁定。其餘的庫,如 gevent,一樣也針對此問題進行了優化,從某種角度上來講仍是不錯的。
TL,DR: While you write code, just give one round of thought on the data structures, the iteration constructs, builtins and create C extensions for tricking the GIL if need. TL,DR: 當你寫代碼的時候,能夠在數據結構、迭代的構建、內置函數上多進行一些考量 ,並在必要時,建立一些 C 擴展來克服 GIL 帶來的問題。