首页 > 编程语言 >Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化

Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化

时间:2023-08-03 22:07:21浏览次数:48  
标签:分析 stats Python gprof2dot py compile pstats cporfile

拿来主义:

python -m cProfile -o profile.pstats to_profile.py 
 gprof2dot -f  pstats profile.pstats |dot -Tpng -o click.png

然后顺着浅色线条优化就OK了。

 windows下:

google下graphviz-2.38.msi,然后安装。dot命令需要。

git clone https://github.com/jrfonseca/gprof2dot.git

然后就是:

D:\KwDownload\gprof2dot-master\gprof2dot-master>python gprof2dot.py -f pstats C:\Users\l00379637\AppData\Roaming\eSpace_Desktop\UserData\l00379637\ReceiveFile\profile.pstats | "c:\Program Files (x86)\Graphviz2.38\bin\dot.exe" -Tpng -o cli
ck.png

  

Python 优化第一步: 性能分析实践

from: http://python.jobbole.com/87621/

Python的性能分析器

Python中最常用的性能分析工具主要有:cProfiler, line_profiler以及memory_profiler等。他们以不同的方式帮助我们分析Python代码的性能。我们这里主要关注Python内置的cProfiler,并使用它帮助我们分析并优化程序。

cProfiler

快速使用

这里我先拿上官方文档的一个简单例子来对cProfiler的简单使用进行简单介绍。

 

 

 

 

 

Python

 

importcProfile
importre
cProfile.run('re.compile("foo|bar")')

分析结果:

 

 

 

 

 

 

Shell

197functioncalls(192primitive calls)in0.002seconds
Ordered by:standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
10.0000.0000.0010.001<string>:1(<module>)
10.0000.0000.0010.001re.py:212(compile)
10.0000.0000.0010.001re.py:268(_compile)
10.0000.0000.0000.000sre_compile.py:172(_compile_charset)
10.0000.0000.0000.000sre_compile.py:201(_optimize_charset)
40.0000.0000.0000.000sre_compile.py:25(_identityfunction)
3/10.0000.0000.0000.000sre_compile.py:33(_compile)

 

从分析报告结果中我们可以得到很多信息:

  1. 整个过程一共有197个函数调用被监控,其中192个是原生调用(即不涉及递归调用)
  2. 总共执行的时间为0.002秒
  3. 结果列表中是按照标准名称进行排序,也就是按照字符串的打印方式(数字也当作字符串)
  4. 在列表中:
  • 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
    pstats模块提供的Stats类可以帮助我们读取和操作stats文件(二进制格式)

 

 

 

 

 

 

Python

 

importpstats
p=pstats.Stats('stats.prof')

 

  • Stats类可以接受stats文件名,也可以直接接受cProfile.Profile对象作为数据源。
  • strip_dirs(): 删除报告中所有函数文件名的路径信息
  • dump_stats(filename): 把stats中的分析数据写入文件(效果同cProfile.Profile.dump_stats())
  • sort_stats(*keys): 对报告列表进行排序,函数会依次按照传入的参数排序,关键词包括callscumtime等,具体参数参见https://docs.python.org/2/library/profile.html#pstats.Stats.sort_stats
  • reverse_order(): 逆反当前的排序
  • print_stats(*restrictions): 把信息打印到标准输出。*restrictions用于控制打印结果的形式, 例如(10, 1.0, ".*.py.*")表示打印所有py文件的信息的前10行结果。

分析数据可视化

gprof2dot

Gprof2Dot可将多种Profiler的数据转成Graphviz可处理的图像表述。配合dot命令,即可得到不同函数所消耗的时间分析图。具体使用方法详见: https://github.com/jrfonseca/gprof2dot

因此我们可以利用它来为我们的程序生成分析图:

 

 

 

 

 

Shell

gprof2dot-fpstats mkm_run.prof|dot-Tpng-omkm_run.png

 

于是我们路径下面就生成了mkm_run.png

我倒是蛮喜欢这个时间分析图,顺着浅色方格的看下去很容易发现程序的瓶颈部分,

每个node的信息如下:

 

 

 

 

 

Python

+------------------------------+
|function name|
|total time%(selftime%)|
|total calls|
+------------------------------+

 

每个edge的信息如下:

 

 

 

 

 

Python

total time%
calls
parent-------------------->children

 

 

标签:分析,stats,Python,gprof2dot,py,compile,pstats,cporfile
From: https://blog.51cto.com/u_11908275/6953406

相关文章

  • python 闭包变量不允许write,要使用nonlocal
     以下是一段简单的闭包代码示例:deffoo():m=3n=5defbar():a=4returnm+n+areturnbar>>>bar=foo()>>>bar()12是可以的!但是:deffoo():m=3n=5defbar():a=4m+=1#不可以!!!return......
  • python 代码混淆工具汇总
    pyminifierPyminifierisaPythoncodeminifier,obfuscator,andcompressor.NoteForthelatest,completedocumentation:http://liftoff.github.io/pyminifier/Forthelatestcode:https://github.com/liftoff/pyminifierOverviewWhenyouinstallpyminifierit......
  • Python安装与配置
    一、Windows下安装Python3。官网地址:https://www.python.org/下载地址:https://www.python.org/ftp/python/3.6.4/python-3.6.4-amd64.exe二、安装1、为了不去设置环境变量,我选择Customizeinstallation安装,并且勾选AddPython3.6toPATH。   2、选择安装路径,我安装......
  • python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以
    pythoncodingstyleguide的快速落地实践机器和人各有所长,如codingstyle检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现codingstyle的自动检查。1.有哪些著名的PythonCodingStyleGuidePEP8https://www.python.org/dev/peps/pep-0008/发明Python语言......
  • SSL 证书过期巡检脚本 (Python 版)
    哈喽大家好,我是咸鱼之前写了个shell版本的SSL证书过期巡检脚本(文章:《SSL证书过期巡检脚本》),后台反响还是很不错的那么今天咸鱼给大家介绍一下python版本的SSL证书过期巡检脚本(完整代码在文末)思路导入相关模块importsslimportsocketimporttimefromdatetime......
  • x86_64 ubuntu22.04环境下编译版本python3.13.0 alpha 0源码——python3.13.0 alpha 0
      python3.13.0alpha0版本源码编译: 环境——x86_64ubuntu22.04系统: 1.源码下载:gitclonehttps://github.com/python/cpython 2.修改apt源地址:编辑文件:sudovim/etc/apt/sources.list添加内容:deb-srchttp://archive.ubuntu.com/ubuntu/jammymain......
  • PEP 703作者给出的一种no-GIL的实现——python3.9的nogil版本
    PEP703的内容是什么,意义又是什么呢?可以说python的官方接受的no-GIL提议的PEP就是PEP703给出的,如果GIL帧的从python中移除那么可以说对整个python生态圈将有着跨越性发展的意义。  ====================================================  PEP703地址:https://peps.p......
  • 【python系列】手把手教你在pypi发布自己的包-他人可pip下载
    前言最近在写一个接口执行引擎用作于接口自动化测试平台的核心。看了挺多资料,做了挺多事情,学了挺多乱七八糟的知识,笔记记得乱糟糟的,以至于一直没有整理发文(啊其实我就是懒),各位见谅。正文如下目前该引擎可以通过pip直接下载,但内容我还在写,预计这个月会完成(大概也许可能可以。)pypi发......
  • 自动生成python程序调用关系逻辑图
    前言你是否因为看一个程序或者运行一个框架,不知道他的运行流程?自己想写一个运行流程却觉得麻烦无从下手?graphviz+pycallgraph帮你绘制让领导看了都拍桌子称赞你的python程序逻辑调用关系图!先来看一下我这段时间在写的一个框架的部分流程吧~密密麻麻,真的哈人,完整的更哈人。狗看了都......
  • python-windows命令行启动appium及杀掉对应接口进程
    文章目录windows命令行启动appium及杀掉对应接口进程一.环境配置1.安装命令行版appium2.安装appium-doctor检测3.python安装Appium-Python-Client:4.定位uiautomatorviewer.bat5.查看主包名主类名Activity二.python-appium启动app1.appium启动一加计算器相关参数:2.windows查看端口......