這篇文章主要介紹了Python性能分析工具Profile使用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
代碼優化的前提是需要了解性能瓶頸在什么地方,程序運行的主要時間是消耗在哪里,對于比較復雜的代碼可以借助一些工具來定位,python 內置了豐富的性能分析工具,如 profile,cProfile 與 hotshot 等。其中 Profiler 是 python 自帶的一組程序,能夠描述程序運行時候的性能,并提供各種統計幫助用戶定位程序的性能瓶頸。Python 標準模塊提供三種 profilers:cProfile,profile 以及 hotshot。
profile 的使用非常簡單,只需要在使用之前進行 import 即可,也可以在命令行中使用。
使用Profile
測試示例:
import profiledef a(): sum = 0 for i in range(1, 10001): sum += i return sumdef b(): sum = 0 for i in range(1, 100): sum += a() return sumif __name__ == "__main__": profile.run("b()")
輸出結果:
<br data-filtered="filtered"> 104 function calls in 0.094 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.094 0.094 :0(exec) 1 0.000 0.000 0.000 0.000 :0(setprofile) 1 0.000 0.000 0.094 0.094 <string>:1(<module>) 1 0.000 0.000 0.094 0.094 profile:0(b()) 0 0.000 0.000 profile:0(profiler) 99 0.094 0.001 0.094 0.001 test.py:15(a) 1 0.000 0.000 0.094 0.094 test.py:21(b)
其中輸出每列的具體解釋如下:
●ncalls:表示函數調用的次數;
●tottime:表示指定函數的總的運行時間,除掉函數中調用子函數的運行時間;
●percall:(第一個 percall)等于 tottime/ncalls;
●cumtime:表示該函數及其所有子函數的調用運行的時間,即函數開始調用到返回的時間;
●percall:(第二個 percall)即函數運行一次的平均時間,等于 cumtime/ncalls;
●filename:lineno(function):每個函數調用的具體信息;
如果需要將輸出以日志的形式保存,只需要在調用的時候加入另外一個參數。如 profile.run(“profileTest()”,”testprof”)。
命令行
如果我們不想在程序中調用profile庫使用,可以在命令行使用命令。
import osdef a(): sum = 0 for i in range(1, 10001): sum += i return sumdef b(): sum = 0 for i in range(1, 100): sum += a() return sumprint b()
運行命令查看性能分析結果
python -m cProfile test.py
將性能分析結果保存到result文件
python -m cProfile -o result test.py
新聞熱點
疑難解答