Python 性能快速優化

byc7 9年前發布 | 20K 次閱讀 Python Python開發

原文出處: infiniteloop.in   譯文出處:yexiaobai(@葉小小小白) 

Python可能最容易扼殺你的想法,但不是最好的代碼實現。盡管強烈反對過早優化,但在 Python 代碼中一點點的優化都可能帶來巨大的性能提升。

解釋僅僅是目的,最正確的方式是天天使用 Python 編程,并且與性能影響相關。

  • %timeit (per line)%prun (cProfile) 在 ipython 的交互式 Shell 中

當你的代碼在工作時,分析你的代碼,并且嘗試找出性能瓶頸在哪里。這不與過早的優化是萬惡之源這個事實相反。這意味著一級優化,而不是進入冗長的優化序列。

更多的分析你的 Python 代碼,你需要閱讀這個 python-performance-analysis

另外一個有趣的包,line_profiler是一行一行的分析代碼
分析 line_profiler

  • 降低方法調用次數,如果你有一個列表需要操作,傳遞整個列表,而不是遍歷整個列表并且傳遞每個元素給函數并返回。
  • 使用 xrange 代替range。(在 Python2.x 中這樣做,因為 Python 3.x 中是默認的)

xrange是range的 C 實現,著眼于有效的內存使用。

  • 對于大數據,使用 numpy,它比標準的數據結構好很多。
  • "".join(string) 比+ or +=好
  • while 1 比while True快
  • list comphrension > for loop > while

列表推導比循環遍歷列表快,但while loop是最慢的,需要使用一個外部計數器。

  • 使用 cProfilecStringIOcPickle

一直使用 C 版本的模塊

  • 使用局部變量

局部變量比全局變量,內建類型以及屬性快。

  • 列表和迭代器版本存在 – 迭代器是內存效率和可伸縮性的。使用itertools

創建生成器以及盡可能使用yeild,它們比正常的列表方式更快。

下面是 Python 性能快速優化的第二部分。

  1. 使用 MapReduceFilter 代替for 循環
  2. 校驗a in b, 字典set列表元組 更好
  3. 當數據量大的時候,盡可能使用不可變數據類型,他們更快 元組 > 列表
  4. 在一個列表中插入數據的復雜度為 O(n)
  5. 如果你需要操作列表的兩端,使用 deque
  6. del – 刪除對象使用如下
    1) python 自己處理它,但確保使用了gc模塊
    2) 編寫__del__函數
    3) 最簡單的方式,使用后調用del
  7. time.clock()
  8. GIL(http://wiki.python.org/moin/GlobalInterpreterLock) – GIL is a daemon

GIL 僅僅允許一個 Python 的原生線程來運行每個進程。阻止 CPU 級別的并行,嘗試使用ctypes和 原生的 C 庫來解決它,當你達到 Python 優化的最后,總是存在一個選項,可以使用原生的 C 重寫慢的函數,通過 Python 的 C 綁定使用它,其他的庫如gevent也是致力于解決這個問題,并且獲得了成功。

TL,DR:當你寫代碼了,過一遍數據結構,迭代結構,內建和為 GIL 創建 C 擴展,如有必要。

更新:multiprocessing 是在 GIL 的范圍之外,這意味著你可以使用multiprocessing這個標準庫來運行多個進程。

看下我的 2013 的印度 PyCon 演講

 本文由用戶 byc7 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!