關於Python Profilers效能分析器

來源:互聯網
上載者:User

想瞭解一下python的效能調試方法,結果就看到這一篇文章,想翻譯下來作個記錄

原文來自於:http://docs.python.org/library/profile.html?highlight=profile#cProfile

1. 介紹效能分析器

profiler是一個程式,用來描述運行時的程式效能,並且從不同方面提供統計資料加以表述。Python中含有3個模組提供這樣的功能,分別是cProfile, profile和pstats。這些分析器提供的是對Python程式的確定性分析。同時也提供一系列的報表產生工具,允許使用者快速地檢查分析結果。

Python標準庫提供了3個不同的效能分析器:

  1. cProfile,推薦給大部分的使用者,是C的一個擴充應用,因為其合理的運行開銷,所以適合分析已耗用時間較長的。是基於lsprof。
  2. profile,一個純python模組,它的介面和cProfile一致。在剖析器時,增加了很大的運行開銷。如果你想擴充profiler的功能,可以試著繼承這個模組
  3. hotshot, 一個實驗性的c模組,關注減少分析時的運行開銷,但是是以需要更長的資料後處理的次數為代價。不過這個模組不再被維護,也有可能在新的python版本中被棄用。
2. 使用方法
def foo():    sum = 0    for i in range(10000):        sum += i    sumA = bar()    sumB = bar()    return sum    def bar():    sum = 0    for i in range(100000):        sum += i    return sum if __name__ == "__main__":    import cProfile    #直接把分析結果列印到控制台    cProfile.run("foo()")    #把分析結果儲存到檔案中,不過內容可讀性差...需要調用pstats模組分析結果    cProfile.run("foo()", "result")    #還可以直接使用命令列進行操作    #>python -m cProfile myscript.py -o result        import pstats    #建立Stats對象    p = pstats.Stats("result")    #這一行的效果和直接運行cProfile.run("foo()")的顯示效果是一樣的    p.strip_dirs().sort_stats(-1).print_stats()    #strip_dirs():從所有模組名中去掉無關的路徑資訊    #sort_stats():把列印資訊按照標準的module/name/line字串進行排序    #print_stats():列印出所有分析資訊    #按照函數名排序     p.strip_dirs().sort_stats("name").print_stats()    #按照在一個函數中累積的已耗用時間進行排序    #print_stats(3):只列印前3行函數的資訊,參數還可為小數,表示前百分之幾的函數資訊    p.strip_dirs().sort_stats("cumulative").print_stats(3)    #還有一種用法    p.sort_stats('time', 'cum').print_stats(.5, 'foo')    #先按time排序,再按cumulative時間排序,然後打倒出前50%中含有函數資訊    #如果想知道有哪些函數調用了bar,可使用    p.print_callers(0.5, "bar")    #同理,查看foo()函數中調用了哪些函數    p.print_callees("foo")

以上是profile以及pstats模組的簡單應用.

3.分析結果圖解

4. 什麼是確定性效能分析(Deterministic Profiling)

確定性效能分析指的是反映所有的函數調用,返回,和例外狀況事件的執行所用的時間,以及它們之間的時間間隔。相比之下,統計性效能分析指的是取樣有效程式指令,然後推匯出所需要的時間,後者花費比較少的開銷,但是給出的結果不夠精確。

在Python中,因為其是解釋性語言,所以在執行程式的時候,會加入解譯器的執行,這部分的執行是不需要進行效能分析的。Python自動為每一個事件提供一個hook,來定位需要分析的代碼。除此之外,因為Python解釋型語言的本質往往需要在執行程式的時候加入很多其它的開銷,而確定性效能分析只會加入一點點處理開銷。這樣一來,確定性效能分析其實開銷不大,還可以提供豐富的統計資訊。

函數調用次數的統計能夠被用於確定程式中的bug,比如一個不符合常理的次數,明顯偏多之類的,還可以用來確定可能的內嵌函式。函數內部已耗用時間的統計可被用來確定”hot loops”,那些需要已耗用時間過長,需要最佳化的部分;累積時間的統計可被用來確定比較高層次的錯誤,比如演算法選擇上的錯誤。Python的效能分析可以允許直接比較演算法的遞迴實現與迭代實現的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.