1. 介绍性能分析器

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

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

cProfile,推荐给大部分的用户,是C的一个扩展应用,因为其合理的运行开销,所以适合分析运行时间较长的。是基于lsprof。

profile,一个纯python模块,它的接口和cProfile一致。在分析程序时,增加了很大的运行开销。如果你想扩展profiler的功能,可以试着继承这个模块

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 iin range(10000):

sum += i

sumA= bar()

sumB= bar()

return sum

def bar():

sum = 0

for iin 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.分析结果图解

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

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

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

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

python性能分析工具模块_python——关于Python Profilers性能分析器相关推荐

  1. python性能分析工具模块_Python Profilers 分析器

    实时用户手册¶ 本节是为 "不想阅读手册" 的用户提供的.它提供了非常简短的概述,并允许用户快速对现有应用程序执行评测. 要分析采用单个参数的函数,可以执行以下操作: import ...

  2. mysql性能分析工具profiling_Mysql系列(十)—— 性能分析工具profiling

    explain是从mysql怎样解析执行sql的角度分析sql优劣.profiling是从sql执行时资源使用情况的角度来分析sql. 分析SQL执行带来的开销是优化SQL的重要手段.在MySQL数据 ...

  3. python测试代码与模块_测量Python代码运行时间

    Python 社区有句俗语: "python自己带着电池" ,别自己写计时框架. Python 2.3 具备一个叫做 timeit 的完美计时工具可以测量python代码的运行时间 ...

  4. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

  5. 11 个 Visual Studio 代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  6. linux 解析pdf下载工具,Linux高级系统级性能分析工具-perf.pdf

    Linux高级系统级性能分析工具-perf Linux 的系统级性能剖析工具‐perf (二) 承刚 TAOBAO  Kernel Team chenggang.qin@ 第三章  Perf top ...

  7. java 对比工具_Java几款性能分析工具的对比

    在给客户进行应用程序维护的过程中,我注意到一些关于高负载条件下的性能问题.理论上,增加对应用程序的负载会使性能有所下降,但是我认为性能下降的比率远远高于负载的增加,同时我也发现,性能可以通过改变应用程 ...

  8. Java几款性能分析工具的对比

    在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题.理论上,增加对应用程序的负载会使性能等比率的下降.然而,我认为性能下降的比率远远高于负载的增加.我也发现,性能可以通过改变应用程序的逻 ...

  9. python性能分析工具总结

    性能分析工具的使用 cProfile 介绍 它是一种确定性的性能分析器,提供了一组API帮助开 发者收集Python程序运行的信息,更确切地说,是统计每个函数消耗的 CPU时间.同时它还提供了其他细节 ...

最新文章

  1. getcoo php_PHP简单实现DES加密解密的方法
  2. 恩智浦智能车大赛2020_2020年中国人工智能机器人大赛在宝鸡市会展中心举办
  3. 震惊!上手就是快,GitHub18.5K标星,超实用的Python资源
  4. 关于vue父子组件之间事件触发及数据传递问题
  5. Linux服务器配置---安装vsftpd
  6. 搭建一个简单的FTP服务器
  7. Matlab--根据bar 的值,用不同的color画
  8. 大话设计模式-原型模式的浅复制与深复制
  9. oracle笔记整理14——性能调优之oracle执行计划
  10. 用matlab算特征值,用Matlab用计算特征值和特征向量
  11. Progressive LayeredExtraction(PLE):ANovelMulti-Task Learning(MTL)ModelforPersonalizedRecommendations
  12. pthread_cond_init 初始化条件变量使用
  13. HR-Saas(二):登录模块
  14. linux下USB3.0端口无法识别3.0设备
  15. 天嵌科技——TQIMX6Q光盘8月更新说明
  16. distinct返回null报错_distinct
  17. jdbc shadring 扩容_shadring-jdbc解决查询数据库分库分表的问题
  18. ubuntu命令行查看dns_Ubuntu命令行网络配置
  19. [LeetCode]122. Best Time to Buy and Sell Stock II
  20. 马航 失联飞机 猜想

热门文章

  1. 英雄会被表彰,这些技术与代码也将被历史铭记
  2. 我的10年富士康故事
  3. FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析
  4. 基于Nexys4 DDR的弹球游戏实现
  5. 计算机基础及wps office应用_自考本科计算机应用基础考试大纲
  6. python二维高斯分布生成_python 多维高斯分布数据生成方式
  7. python训练手势分类器_使用Pytorch训练分类器详解(附python演练)
  8. ECMS系统服务器死机的处理,内存问题服务器死机一例
  9. python3性能还低吗_谁说Python性能差的?-- 让python比awk快 (3)
  10. html去除分页符,Word如何取消分页符