profiler是一个程序,用来描述运行时的程序性能,而且从不一样方面提供统计数据加以表述。Python中含有3个模块提供这样的功能,分别是cProfile, profile和pstats。这些分析器提供的是对Python程序的肯定性分析。同时也提供一系列的报表生成工具,容许用户快速地检查分析结果。html
Python标准库提供了3个不一样的性能分析器:python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
def
foo():
sum
=
0
for
i
in
range
(
10000
):
sum
+
=
i
sumA
=
bar()
sumB
=
bar()
return
sum
def
bar():
sum
=
0
for
i
in
range
(
100000
):
sum
+
=
i
return
sum
if
__name__
=
=
"__main__"
:
import
cProfile
#直接把分析结果打印到控制台
cProfile.run(
"foo()"
)
#把分析结果保存到文件中,不过内容可读性差...须要调用pstats模块分析结果
cProfile.run(
"foo()"
,
"result"
)
#还能够直接使用命令行进行操做
#>python -m cProfile myscript.py -o result
import
pstats
#建立Stats对象
p
=
pstats.Stats(
"result"
)
#这一行的效果和直接运行cProfile.run("foo()")的显示效果是同样的
p.strip_dirs().sort_stats(
-
1
).print_stats()
#strip_dirs():从全部模块名中去掉无关的路径信息
#sort_stats():把打印信息按照标准的module/name/line字符串进行排序
#print_stats():打印出全部分析信息
#按照函数名排序
p.strip_dirs().sort_stats(
"name"
).print_stats()
#按照在一个函数中累积的运行时间进行排序
#print_stats(3):只打印前3行函数的信息,参数还可为小数,表示前百分之几的函数信息
p.strip_dirs().sort_stats(
"cumulative"
).print_stats(
3
)
#还有一种用法
p.sort_stats(
'time'
,
'cum'
).print_stats(.
5
,
'foo'
)
#先按time排序,再按cumulative时间排序,而后打倒出前50%中含有函数信息
#若是想知道有哪些函数调用了bar,可以使用
p.print_callers(
0.5
,
"bar"
)
#同理,查看foo()函数中调用了哪些函数
p.print_callees(
"foo"
)
|
以上是profile以及pstats模块的简单应用.算法
肯定性性能分析指的是反映全部的函数调用,返回,和异常事件的执行所用的时间,以及它们之间的时间间隔。相比之下,统计性性能分析指的是取样有效的程序指令,而后推导出所须要的时间,后者花费比较少的开销,可是给出的结果不够精确。函数
在Python中,由于其是解释性语言,因此在执行程序的时候,会加入解释器的执行,这部分的执行是不须要进行性能分析的。Python自动为每个事件提供一个hook,来定位须要分析的代码。除此以外,由于Python解释型语言的本质每每须要在执行程序的时候加入不少其它的开销,而肯定性性能分析只会加入一点点处理开销。这样一来,肯定性性能分析其实开销不大,还能够提供丰富的统计信息。工具
函数调用次数的统计可以被用于肯定程序中的bug,好比一个不符合常理的次数,明显偏多之类的,还能够用来肯定可能的内联函数。函数内部运行时间的统计可被用来肯定”hot loops”,那些须要运行时间过长,须要优化的部分;累积时间的统计可被用来肯定比较高层次的错误,好比算法选择上的错误。Python的性能分析能够容许直接比较算法的递归实现与迭代实现的。oop