Python性能分析工具Profile
?
?
代碼優(yōu)化的前提是需要了解性能瓶頸在什么地方,程序運(yùn)行的主要時(shí)間是消耗在哪里,對(duì)于比較復(fù)雜的代碼可以借助一些工具來(lái)定位,python 內(nèi)置了豐富的性能分析工具,如 profile,cProfile 與 hotshot 等。其中 Profiler 是 python 自帶的一組程序,能夠描述程序運(yùn)行時(shí)候的性能,并提供各種統(tǒng)計(jì)幫助用戶定位程序的性能瓶頸。Python 標(biāo)準(zhǔn)模塊提供三種 profilers:cProfile,profile 以及 hotshot。 profile 的使用非常簡(jiǎn)單,只需要在使用之前進(jìn)行 import 即可,也可以在命令行中使用。
?
使用Profile
測(cè)試示例:
import profile def a(): sum = 0 for i in range(1, 10001 ): sum += i return sum def b(): sum = 0 for i in range(1, 100 ): sum += a() return sum if __name__ == " __main__ " : profile.run( " b() " )
輸出結(jié)果:
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:1( ) 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:表示函數(shù)調(diào)用的次數(shù); ●tottime:表示指定函數(shù)的總的運(yùn)行時(shí)間,除掉函數(shù)中調(diào)用子函數(shù)的運(yùn)行時(shí)間; ●percall:(第一個(gè) percall)等于 tottime/ncalls; ●cumtime:表示該函數(shù)及其所有子函數(shù)的調(diào)用運(yùn)行的時(shí)間,即函數(shù)開始調(diào)用到返回的時(shí)間; ●percall:(第二個(gè) percall)即函數(shù)運(yùn)行一次的平均時(shí)間,等于 cumtime/ncalls; ●filename:lineno(function):每個(gè)函數(shù)調(diào)用的具體信息; 如果需要將輸出以日志的形式保存,只需要在調(diào)用的時(shí)候加入另外一個(gè)參數(shù)。如 profile.run(“profileTest()”,”testprof”)。
?
?
命令行
如果我們不想在程序中調(diào)用profile庫(kù)使用,可以在命令行使用命令。
import os def a(): sum = 0 for i in range(1, 10001 ): sum += i return sum def b(): sum = 0 for i in range(1, 100 ): sum += a() return sum print b()
?
運(yùn)行命令查看性能分析結(jié)果
python -m cProfile test .py
?
將性能分析結(jié)果保存到result文件
python -m cProfile -o result test .py
?
使用pstats來(lái)格式化顯示結(jié)果
python - c "import pstats; p=pstats.Stats('reslut); p.print_stats()"
?
python - c "import pstats; p=pstats.Stats('result'); p.sort_stats('time').print_stats()
sort_stats支持一下參數(shù): calls, cumulative, file, line, module, name, nfl, pcalls, stdname, time
?
?
測(cè)試示例:在代碼中直接使用profile與stats
import os def a(): sum = 0 for i in range(1, 10001 ): sum += i return sum def b(): sum = 0 for i in range(1, 100 ): sum += a() return sum print b() import cProfile # cProfile.run("b()") cProfile.run( " b() " , " result " ) import pstats pstats.Stats( ' result ' ).sort_stats(-1).print_stats()
?
refence
https://blog.csdn.net/xiemanR/article/details/69398057
https://www.cnblogs.com/wangjian8888/p/6095772.html
https://blog.csdn.net/kongxx/article/details/52216850
http://ju.outofmemory.cn/entry/46805
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
