Python 優化第一步: 性能分析實踐 使用cporfile+gprof2dot可視化


拿來主義:

 python -m cProfile -o profile.pstats to_profile.py 
 gprof2dot -f  pstats profile.pstats |dot -Tpng -o click.png

然后順着淺色線條優化就OK了。

 windows下:

google下graphviz-2.38.msi,然后安裝。dot命令需要。

git clone https://github.com/jrfonseca/gprof2dot.git

然后就是:

D:\KwDownload\gprof2dot-master\gprof2dot-master>python gprof2dot.py -f pstats C:\Users\l00379637\AppData\Roaming\eSpace_Desktop\UserData\l00379637\ReceiveFile\profile.pstats | "c:\Program Files (x86)\Graphviz2.38\bin\dot.exe" -Tpng -o cli
ck.png

  

Python 優化第一步: 性能分析實踐

Python的性能分析器

Python中最常用的性能分析工具主要有:cProfiler, line_profiler以及memory_profiler等。他們以不同的方式幫助我們分析Python代碼的性能。我們這里主要關注Python內置的cProfiler,並使用它幫助我們分析並優化程序。

cProfiler

快速使用

這里我先拿上官方文檔的一個簡單例子來對cProfiler的簡單使用進行簡單介紹。

分析結果:

從分析報告結果中我們可以得到很多信息:

  1. 整個過程一共有197個函數調用被監控,其中192個是原生調用(即不涉及遞歸調用)
  2. 總共執行的時間為0.002秒
  3. 結果列表中是按照標准名稱進行排序,也就是按照字符串的打印方式(數字也當作字符串)
  4. 在列表中:
    • ncalls表示函數調用的次數(有兩個數值表示有遞歸調用,總調用次數/原生調用次數)
    • tottime是函數內部調用時間(不包括他自己調用的其他函數的時間)
    • percall等於 tottime/ncalls
    • cumtime累積調用時間,與tottime相反,它包含了自己內部調用函數的時間
    • 最后一列,文件名,行號,函數名

優雅的使用

Python給我們提供了很多接口方便我們能夠靈活的進行性能分析,其中主要包含兩個類cProfile模塊的Profile類和pstat模塊的Stats類。

我們可以通過這兩個類來將代碼分析的功能進行封裝以便在項目的其他地方能夠靈活重復的使用進行分析。

這里還是需要對Profile以及Stats的幾個常用接口進行簡單總結:

Profile類:

  • enable(): 開始收集性能分析數據
  • disable(): 停止收集性能分析數據
  • create_stats(): 停止收集分析數據,並為已收集的數據創建stats對象
  • print_stats(): 創建stats對象並打印分析結果
  • dump_stats(filename): 把當前性能分析的結果寫入文件(二進制格式)
  • runcall(func, *args, **kwargs): 收集被調用函數func的性能分析數據Stats
    pstats模塊提供的Stats類可以幫助我們讀取和操作stats文件(二進制格式)

 

 

  • Stats類可以接受stats文件名,也可以直接接受cProfile.Profile對象作為數據源。
    • strip_dirs(): 刪除報告中所有函數文件名的路徑信息
    • dump_stats(filename): 把stats中的分析數據寫入文件(效果同cProfile.Profile.dump_stats())
    • sort_stats(*keys): 對報告列表進行排序,函數會依次按照傳入的參數排序,關鍵詞包括callscumtime等,具體參數參見https://docs.python.org/2/library/profile.html#pstats.Stats.sort_stats
    • reverse_order(): 逆反當前的排序
    • print_stats(*restrictions): 把信息打印到標准輸出。*restrictions用於控制打印結果的形式, 例如(10, 1.0, ".*.py.*")表示打印所有py文件的信息的前10行結果。

分析數據可視化

gprof2dot

Gprof2Dot可將多種Profiler的數據轉成Graphviz可處理的圖像表述。配合dot命令,即可得到不同函數所消耗的時間分析圖。具體使用方法詳見: https://github.com/jrfonseca/gprof2dot

因此我們可以利用它來為我們的程序生成分析圖:

於是我們路徑下面就生成了mkm_run.png

我倒是蠻喜歡這個時間分析圖,順着淺色方格的看下去很容易發現程序的瓶頸部分,

每個node的信息如下:

每個edge的信息如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM