1. 程式人生 > >筆記-Python-cProfile

筆記-Python-cProfile

bar pytho 刪除 統計數據 new c語言實現 seconds 筆記 通過

筆記-Python-cProfile

1. 簡介
python官方提供了cProfile和profile對程序進行性能分析,建議使用cProfile;
cProfile:基於lsprof的用C語言實現的擴展應用,運行開銷比較合理,適合分析運行時間較長的程序,推薦使用這個模塊;
profile:純Python實現的性能分析模塊,接口和cProfile一致。但在分析程序時增加了很大的運行開銷。不過,如果你想擴展profiler的功能,可以通過繼承這個模塊實現;
引用於python3.6.5官方文檔-標準庫-27.4


2. cProfile使用
2.1. 模塊簡介

profile.run(command,filename = None,sort = -1 )
該函數執行並從執行中收集分析統計數據。如果沒有給出文件名,則該函數創建一個Stats 實例並打印一個簡單的性能分析報告。如果指定了排序方式,此Stats實例以指定方式排序。
常用參數:
# 直接把分析結果打印到控制臺
cProfile.run("test()")
# 把分析結果保存到文件中
cProfile.run("test()", filename="result.out")
# 指定排序方式
cProfile.run("test()", filename="result.out", sort="cumulative")

import cProfile
import re
cProfile.run(‘re.compile("foo|bar")‘)
結果
126 function calls in 0.000 seconds #126個調用,數字指原始調用,不包括遞歸;
Ordered by: standard name #
#調用數量,時間開銷(不包括子函數),
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
4 0.000 0.000 0.000 0.000 enum.py:265(__call__)
4 0.000 0.000 0.000 0.000 enum.py:515(__new__)
2 0.000 0.000 0.000 0.000 enum.py:801(__and__)
1 0.000 0.000 0.000 0.000 re.py:231(compile)
1 0.000 0.000 0.000 0.000 re.py:286(_compile)
1 0.000 0.000 0.000 0.000
…僅羅列部分

class profile.Profile(timer = None,timeunit = 0.0,subcalls = True,builtins = True )
這個類通常只在需要比cProfile.run()函數提供更精確的分析控制時才使用。
使用案例:
import cProfile, pstats, io
pr = cProfile.Profile()
pr.enable()
# ... do something ...
pr.disable()
s = io.StringIO()
sortby = ‘cumulative‘
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print(s.getvalue())
函數釋義:
enable()開始收集分析數據。
disable()停止收集分析數據。
create_stats()停止收集性能數據並創建stats對象。
print_stats(sort = -1 )創建一個Stats對象並將結果輸出到stdout。
dump_stats(filename)將當前分析的結果寫入文件(二進制格式)。
runcall(func, *args, **kwargs): 收集被調用函數func的性能分析數據Stats類
pstats模塊提供的Stats類可以幫助我們讀取和操作stats文件(二進制格式)

3. 關於Stats類
Stats類源自pstats模塊,使用前import pstats
主要用於格式化展示cprofile的分析結果;

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

筆記-Python-cProfile