[python]用profile协助程序性能优化
转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728
本文最初发表于恋花蝶的博客http://blog.csdn.net/lanphaday,欢迎转载,但请务必保留原文完整,并保留本声明。
def foo():
sum = 0
for i in range(100):
sum += i
return sum
if __name__ == "__main__":
foo()
|
if __name__ == "__main__":
import profile
profile.run("foo()")
|
5 function calls in 0.143 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 :0(range)
1 0.143 0.143 0.143 0.143 :0(setprofile)
1 0.000 0.000 0.000 0.000 <string>:1(?)
1 0.000 0.000 0.000 0.000 prof1.py:1(foo)
1 0.000 0.000 0.143 0.143 profile:0(foo())
0 0.000 0.000 profile:0(profiler)
|
python -m profile prof1.py |
ncalls | 函数的被调用次数 |
tottime | 函数总计运行时间,除去函数中调用的函数运行时间 |
percall | 函数运行一次的平均时间,等于tottime/ncalls |
cumtime | 函数总计运行时间,含调用的函数运行时间 |
percall | 函数运行一次的平均时间,等于cumtime/ncalls |
filename:lineno(function) | 函数所在的文件名,函数的行号,函数名 |
# …略
if __name__ == "__main__":
import profile
profile.run("foo()", "prof.txt")
import pstats
p = pstats.Stats("prof.txt")
p.sort_stats("time").print_stats()
|
Sun Jan 14 00:03:12 2007 prof.txt
5 function calls in 0.002 CPU seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.002 0.002 0.002 0.002 :0(setprofile)
1 0.000 0.000 0.002 0.002 profile:0(foo())
1 0.000 0.000 0.000 0.000 G:/prof1.py:1(foo)
1 0.000 0.000 0.000 0.000 <string>:1(?)
1 0.000 0.000 0.000 0.000 :0(range)
0 0.000 0.000 profile:0(profiler)
|
strip_dirs() | 用以除去文件名前名的路径信息。 |
add(filename,[…]) | 把profile的输出文件加入Stats实例中统计 |
dump_stats(filename) | 把Stats的统计结果保存到文件 |
sort_stats(key,[…]) | 最重要的一个函数,用以排序profile的输出 |
reverse_order() | 把Stats实例里的数据反序重排 |
print_stats([restriction,…]) | 把Stats报表输出到stdout |
print_callers([restriction,…]) |
输出调用了指定的函数的函数的相关信息
|
print_callees([restriction,…]) | 输出指定的函数调用过的函数的相关信息 |
‘ncalls’ | 被调用次数 |
‘cumulative’ | 函数运行的总时间 |
‘file’ | 文件名 |
‘module’ | 文件名 |
‘pcalls’ | 简单调用统计(兼容旧版,未统计递归调用) |
‘line’ | 行号 |
‘name’ | 函数名 |
‘nfl’ | Name/file/line |
‘stdname’ | 标准函数名 |
‘time’ | 函数内部运行时间(不计调用子函数的时间) |
p.strip_dirs().sort_stats(-1).print_stats()
# …略
if __name__ == "__main__":
import hotshot
import hotshot.stats
prof = hotshot.Profile("hs_prof.txt", 1)
prof.runcall(foo)
prof.close()
p = hotshot.stats.load("hs_prof.txt")
p.print_stats()
|
1 function calls in 0.003 CPU seconds
Random listing order was used
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.003 0.003 0.003 0.003 i:/prof1.py:1(foo)
0 0.000 0.000 profile:0(profiler)
|
run(cmd) | 执行一段脚本,跟profile模块的run()函数一样功能 |
runcall(func, *args, **keywords) | 调用一个函数,并统计相关的运行信息 |
runctx(cmd, globals, locals) | 指定一段脚本的执行环境,执行脚本并统计运行信息 |
>>> t = timeit.Timer("t = foo()/nprint t") ß被timeit的代码段
>>> t.timeit()
Traceback (most recent call last):
File "<pyshell#12>", line 1, in -toplevel-
t.timeit()
File "E:/Python23/lib/timeit.py", line 158, in timeit
return self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
foo() ß标准输出是这样的
NameError: global name ‘foo‘ is not defined
>>> try:
t.timeit()
except:
t.print_exc()
Traceback (most recent call last):
File "<pyshell#17>", line 2, in ?
File "E:/Python23/lib/timeit.py", line 158, in timeit
return self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
t = foo() ßprint_exc()的输出是这样的,方便定位错误
NameError: global name ‘foo‘ is not defined
|
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。