正文
1
0.000
0.000
0.000
0.000
sre_compile
.py
:
172
(
_compile_charset
)
1
0.000
0.000
0.000
0.000
sre_compile
.py
:
201
(
_optimize_charset
)
4
0.000
0.000
0.000
0.000
sre_compile
.py
:
25
(
_identityfunction
)
3
/
1
0.000
0.000
0.000
0.000
sre_compile
.py
:
33
(
_compile
)
从分析报告结果中我们可以得到很多信息:
-
整个过程一共有197个函数调用被监控,其中192个是原生调用(即不涉及递归调用)
-
总共执行的时间为0.002秒
-
结果列表中是按照标准名称进行排序,也就是按照字符串的打印方式(数字也当作字符串)
-
在列表中:
-
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类
Stats类
import
pstats
p
=
pstats
.
Stats
(
'stats.prof'
)
Stats类可以接受stats文件名,也可以直接接受cProfile.Profile对象作为数据源。
-
strip_dirs(): 删除报告中所有函数文件名的路径信息
-
dump_stats(filename): 把stats中的分析数据写入文件(效果同cProfile.Profile.dump_stats())
-
sort_stats(*keys): 对报告列表进行排序,函数会依次按照传入的参数排序,关键词包括calls, cumtime等,具体参数参见https://docs.python.org/2/library/profile.html#pstats.Stats.sort_stats
-
reverse_order(): 逆反当前的排序
-
print_stats(*restrictions): 把信息打印到标准输出。*restrictions用于控制打印结果的形式, 例如(10, 1.0, ".*.py.*")表示打印所有py文件的信息的前10行结果。
有了上面的接口我们便可以更
优雅
的去使用分析器来分析我们的程序,例如可以通过写一个
带有参数的装饰器
,这样想分析项目中任何一个函数,便可方便的使用装饰器来达到目的。
import
cProfile
import
pstats
import
os
# 性能分析装饰器定义
def
do_cprofile
(
filename
)