关于Python Profilers性能分析器

转自:http://www.cnblogs.com/btchenguang/archive/2012/02/03/2337112.html

想了解一下python的性能调试方法,结果就看到这一篇文章,想翻译下来作个记录

原文来自于:http://docs.python.org/library/profile.html?highlight=profile#cProfile

1. 介绍性能分析器

profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述。Python中含有3个模块提供这样的功能,分别是cProfile, profile和pstats。这些分析器提供的是对Python程序的确定性分析。同时也提供一系列的报表生成工具,允许用户快速地检查分析结果。

Python标准库提供了3个不同的性能分析器:

  1. cProfile,推荐给大部分的用户,是C的一个扩展应用,因为其合理的运行开销,所以适合分析运行时间较长的。是基于lsprof。
  2. profile,一个纯python模块,它的接口和cProfile一致。在分析程序时,增加了很大的运行开销。如果你想扩展profiler的功能,可以试着继承这个模块
  3. hotshot, 一个试验性的c模块,关注减少分析时的运行开销,但是是以需要更长的数据后处理的次数为代价。不过这个模块不再被维护,也有可能在新的python版本中被弃用。

2. 使用方法

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模块的简单应用.

3.分析结果图解

profile result

4. 什么是确定性性能分析(Deterministic Profiling)

确定性性能分析指的是反映所有的函数调用,返回,和异常事件的执行所用的时间,以及它们之间的时间间隔。相比之下,统计性性能分析指的是取样有效的程序指令,然后推导出所需要的时间,后者花费比较少的开销,但是给出的结果不够精确。

在Python中,因为其是解释性语言,所以在执行程序的时候,会加入解释器的执行,这部分的执行是不需要进行性能分析的。Python自动为每一个事件提供一个hook,来定位需要分析的代码。除此之外,因为Python解释型语言的本质往往需要在执行程序的时候加入很多其它的开销,而确定性性能分析只会加入一点点处理开销。这样一来,确定性性能分析其实开销不大,还可以提供丰富的统计信息。

函数调用次数的统计能够被用于确定程序中的bug,比如一个不符合常理的次数,明显偏多之类的,还可以用来确定可能的内联函数。函数内部运行时间的统计可被用来确定”hot loops”,那些需要运行时间过长,需要优化的部分;累积时间的统计可被用来确定比较高层次的错误,比如算法选择上的错误。Python的性能分析可以允许直接比较算法的递归实现与迭代实现的。

作者: btchenguang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值