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记大量的笔记(记录所有的事情)在做性能调优问题的时候很重要的一个操作就是记录下所有的事情,包括每一个输出.执行的结果.可以新建一个文件夹,然后把结果的文件都塞到该文件夹内.包括 ...
随机推荐
- 20165211 2017-2018-2 《Java程序设计》第3周学习总结
20165211 2017-2018-2 <Java程序设计>第3周学习总结 教材学习内容总结 本周,我学习了书本上第四章的内容,以下是我整理的主要知识. 第四章 类与对象 编程语言的几个 ...
- 20145221高其_PC平台逆向破解_advanced
20145221高其_PC平台逆向破解_advanced 实践目录 shellcode注入 Return-to-libc 攻击实验 shellcode注入 概述 Shellcode实际是一段代码(也可 ...
- assert_param
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用.如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义 ...
- 【第二十八章】 springboot + zipkin(brave定制-AsyncHttpClient)
brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...
- hdu 6406 Taotao Picks Apples 线段树 单点更新
Taotao Picks Apples Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- js delete可以删除对象属性及变量
,对象属性删除 function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);//mm delete o ...
- ubuntu16.04上安装Jenkins,获取登陆密码
sudo cat /usr/share/tomcat7/.jenkins/secrets/initialAdminPassword
- STL_算法_02_排序算法
◆ 常用的排序算法: 1.1.合并(容器A(全部/部分)&容器B(全部/部分)==>容器C(全部/部分),容器C中元素已经排好顺序),返回的值==>iteratorOutBegin ...
- queue_01
A.添加/移除 void queue::push(elemValue); // 尾部添加 viud queue::pop(); // 尾部移除 B.随机存取 C.数据存取 T queue::back ...
- Socket入门之前的知识点
Socket难点 数据粘包 心跳维持 数据丢包 性能问题 7层网络模型-OSI 基础层:物理层(Physical).数据链路层(Datalink).网络层(Network) 传输层(Transport ...