本文的原文是:Profiling Python Scriptspython
我有一個負責一個長期運行任務的 Python 腳本。這個腳本同其餘三個系統通訊 - 它從系統 #1 和 #2 讀取數據,合併它們而後再把它們推送到系統 #3。這是下面的描述。問題是遷移運行在我不滿意的一個地方。由於我想知道該腳本的大部分工做是在與哪一個慢的外部系統進行通訊。Python 有一個很是好用的內建的分析器來回答這類問題。按照這篇文章來學習如何使用它。ubuntu
基礎用法很是簡單。假設你有一個 myscript.py
。使用 profiler
運行它,你須要作的是:app
$ python -m cProfile -o profile.out myscript.py <other-args>
它將運行這個腳本而且 dump 這個 debug 數據到 profile.out。你也能夠省略 -o profile.out
來讓統計的 dumped 到腳本最後的 stdout。函數
若是你的腳本使用了任何 subprocesses,事情就會變得有點複雜。以我來講,我對腳本的主流程不感興趣 - 它所作的全部事情就是派生(spawn)一些 worker 子進程。我感興趣的是在 worker 中發生了什麼。post
讓咱們假設你的代碼與此相似:學習
import multiprocessing import time def worker(num): time.sleep(3) print 'Worker:', num if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) p.start()
你須要引入另一個間接層:優化
import multiprocessing import cProfile import time def worker(num): time.sleep(3) print 'Worker:', num def profile_worker(num): cProfile.runctx('test(num)', globals(), locals(), 'profile-%d.out' %num) if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=profile_worker, args=(i,)) p.start()
就是這樣。這個腳本運行以後,你將獲得 profile-0.out
到 profile-4.out
這4個文件。spa
若是你忽略 -o profile.out
這時將在 stdout 獲得統計數據。這不是一個完美的解決方案。更好的解決方案是把數據 dump 到文件中而後使用 runsnake 來分析它。爲了在 ubuntu 上安裝它,你須要 wxpython 包,而後你纔可使用 easy-install
安裝它。debug
$ sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-doc wx2.8-examples wx2.8-headers wx2.8-i18n $ sudo easy-install SquareMap RunSnakeRun
因爲某種緣由我沒有在 virtualenv 中運行工做。我須要一個全系統的 easy-install。有人抱怨缺失了 wx
模塊。個人系統是 ubuntu 12.04。code
而後,就很簡單了:
$ runsnake profile.out
你在不一樣的函數得到了很好的統計分析,調用次數和累計時間。這些數據能夠告訴你關於你 app 的不少東西。以我而言我獲悉了與其中一個系統通訊花費了 90% 的時間。從那裏開始我能夠優化它。
來源