Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化
拿来主义:
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
|
1
2
3
|
import cProfile
import re
cProfile.run('re.compile("foo|bar")')
|
分析结果:
Shell
|
1
2
3
4
5
6
7
8
9
10
|
197 function calls (192 primitive calls) in 0.002 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.001 0.001 <string>:1(<module>)
1 0.000 0.000 0.001 0.001 re.py:212(compile)
1 0.000 0.000 0.001 0.001 re.py:268(_compile)
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/ncallscumtime累积调用时间,与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
|
1
2
|
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_statsreverse_order(): 逆反当前的排序print_stats(*restrictions): 把信息打印到标准输出。*restrictions用于控制打印结果的形式, 例如(10, 1.0, ".*.py.*")表示打印所有py文件的信息的前10行结果。
分析数据可视化
gprof2dot
Gprof2Dot可将多种Profiler的数据转成Graphviz可处理的图像表述。配合dot命令,即可得到不同函数所消耗的时间分析图。具体使用方法详见: https://github.com/jrfonseca/gprof2dot
因此我们可以利用它来为我们的程序生成分析图:
Shell
|
1
|
gprof2dot -f pstats mkm_run.prof | dot -Tpng -o mkm_run.png
|
于是我们路径下面就生成了mkm_run.png
我倒是蛮喜欢这个时间分析图,顺着浅色方格的看下去很容易发现程序的瓶颈部分,
每个node的信息如下:
Python
|
1
2
3
4
5
|
+------------------------------+
| function name |
| total time % ( self time % ) |
| total calls |
+------------------------------+
|
每个edge的信息如下:
Python
|
1
2
3
|
total time %
calls
parent --------------------> children
|
Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化的更多相关文章
- linux系统性能调优第一步——性能分析(vmstat)
linux系统性能调优第一步--性能分析(vmstat) 分类: LINUX 性能调优的第一步是性能分析,下面从性能分析着手进行一些介绍,尤其对linux性能分析工具vmstat的用法和实践进行详细介 ...
- 轻松应对并发问题,简易的火车票售票系统,Newbe.Claptrap 框架用例,第一步 —— 业务分析
Newbe.Claptrap 框架非常适合于解决具有并发问题的业务系统.火车票售票系统,就是一个非常典型的场景用例. 本系列我们将逐步从业务.代码.测试和部署多方面来介绍,如何使用 Newbe.Cla ...
- Python 编程第一步
Python 编程第一步 在前面的教程中我们已经学习了一些 Python3 的基本语法知识,下面我们尝试来写一个斐波纳契数列. # Fibonacci series: 斐波纳契数列 # 两个元素的总 ...
- python面试总结3(性能分析优化,GIl常考题)
python性能分析和优化,GIL常考题 什么是Cpython GIL Cpython解释器的内存管理并不是线程安全的 保护多线程情况下对python对象访问 Cpython使用简单的锁机制避免多个线 ...
- 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...
- python 数据较大 性能分析
前提:若有一个几百M的文件需要解析,某个函数需要运行很多次(几千次),需要考虑性能问题 性能分析模块:cProfile 使用方法:cProfile.run("func()"),其中 ...
- Python爬虫第一步
这只是记录一下自己学习爬虫的过程,可能少了些章法.我使用过的是Python3.x版本,IDE为Pycharm. 这里贴出代码集合,这一份代码也是以防自己以后忘记了什么,方便查阅. import req ...
- 1.python的第一步
学习python也有一段时间了,自认为基本算是入门了,想要写一些博客进行知识的汇总的时候.却发现不知道该从何说起了,因为python这门语言在语法上其实并不难,关键在于如何建立程序员的思维方式,而对于 ...
- Linux性能优化 第一章 性能追踪建议
1.1常用建议1.1.1记大量的笔记(记录所有的事情)在做性能调优问题的时候很重要的一个操作就是记录下所有的事情,包括每一个输出.执行的结果.可以新建一个文件夹,然后把结果的文件都塞到该文件夹内.包括 ...
随机推荐
- Removing bad blocks from the USB drive with fsck
An easy way to repair a flash drive, or any drive really, is to use the fsck tool. This tool is grea ...
- Mysql的基本语句
Mysql的基本语句 1.查询当前数据库所有表名: -- 方案一: show tables; --方案二:jeesite为数据库 select table_name from information_ ...
- 20145225《网络对抗》Exp7 网络欺诈技术防范
基础问题回答 通常在什么场景下容易受到DNS spoof攻击? 在同一局域网下比较容易受到DNS spoof攻击,攻击者可以冒充域名服务器,来发送伪造的数据包,从而修改目标主机的DNS缓存表,达到DN ...
- bzoj 2654 tree - 二分法 - 最小生成树
给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色边数. 接下来E行,每行 ...
- idata,xdata,pdata,code
data ---> 可寻址片内ram bdata ---> 可位寻址的片内ram idata ---> 可寻址片内ram,允许访问全部内部ra ...
- 如何修改bootstrap模态框的backdrop蒙版区域的颜色?
参考地址: http://www.cnblogs.com/9miao/p/4988196.html 蒙板样式实现: 大家或许注意到了,在做模态弹出窗时,底部常常会有一个透明的黑色蒙层效果:在Boots ...
- C#学习笔记(十三):继承
继承 object是引用类型 public:最高权限,公开的 Protected:外部不可以访问 Internal:类的默认访问是什么作用域 Private:类成员默认 基类实例:可以通过base ...
- Java课程设计—拿火柴小游戏
这是我的Java课程设计,做的是拿火柴小游戏.要求是人机互拿火柴,拿到最后一根火柴者赢.最主要的就是处理好多线程,其他的就是添加组件啥的,那个不难,我就给出以下多线程的代码吧. import java ...
- Windows 10 无法调节亮度的解决办法
我的笔记本在更新完14393后开始的一段时间内是可以正常调节亮度的,但是后来就莫名奇妙地不能调节亮度了,而且电源选项里的亮度调节滚动条也不见了.网上查了很多方法,诸如修改注册表.更新驱动之类的都试过, ...
- 肿瘤基因组学数据库终结者:cBioPortal---转载
转载自:http://blog.sciencenet.cn/blog-1509670-1000479.html 随着芯片和高通量测序技术的广泛应用,在肿瘤研究领域积累了越来越多的基因组学数据,特别是像 ...