拿来主义:

 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)

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

  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

 
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): 对报告列表进行排序,函数会依次按照传入的参数排序,关键词包括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

 
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可视化的更多相关文章

  1. linux系统性能调优第一步——性能分析(vmstat)

    linux系统性能调优第一步--性能分析(vmstat) 分类: LINUX 性能调优的第一步是性能分析,下面从性能分析着手进行一些介绍,尤其对linux性能分析工具vmstat的用法和实践进行详细介 ...

  2. 轻松应对并发问题,简易的火车票售票系统,Newbe.Claptrap 框架用例,第一步 —— 业务分析

    Newbe.Claptrap 框架非常适合于解决具有并发问题的业务系统.火车票售票系统,就是一个非常典型的场景用例. 本系列我们将逐步从业务.代码.测试和部署多方面来介绍,如何使用 Newbe.Cla ...

  3. Python 编程第一步

    Python  编程第一步 在前面的教程中我们已经学习了一些 Python3 的基本语法知识,下面我们尝试来写一个斐波纳契数列. # Fibonacci series: 斐波纳契数列 # 两个元素的总 ...

  4. python面试总结3(性能分析优化,GIl常考题)

    python性能分析和优化,GIL常考题 什么是Cpython GIL Cpython解释器的内存管理并不是线程安全的 保护多线程情况下对python对象访问 Cpython使用简单的锁机制避免多个线 ...

  5. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  6. python 数据较大 性能分析

    前提:若有一个几百M的文件需要解析,某个函数需要运行很多次(几千次),需要考虑性能问题 性能分析模块:cProfile 使用方法:cProfile.run("func()"),其中 ...

  7. Python爬虫第一步

    这只是记录一下自己学习爬虫的过程,可能少了些章法.我使用过的是Python3.x版本,IDE为Pycharm. 这里贴出代码集合,这一份代码也是以防自己以后忘记了什么,方便查阅. import req ...

  8. 1.python的第一步

    学习python也有一段时间了,自认为基本算是入门了,想要写一些博客进行知识的汇总的时候.却发现不知道该从何说起了,因为python这门语言在语法上其实并不难,关键在于如何建立程序员的思维方式,而对于 ...

  9. Linux性能优化 第一章 性能追踪建议

    1.1常用建议1.1.1记大量的笔记(记录所有的事情)在做性能调优问题的时候很重要的一个操作就是记录下所有的事情,包括每一个输出.执行的结果.可以新建一个文件夹,然后把结果的文件都塞到该文件夹内.包括 ...

随机推荐

  1. 01: RestfulAPI与HTTP

    1.1 RestfulAPI与HTTP简介 1.什么是RestfulAPI 1.REST直接翻译:表现层状态转移,实质就是一种面向资源编程的方法 2.REST描述的是在网络中client和server ...

  2. 更换 nodejs npm 镜像为 淘宝 镜像

    淘宝npm镜像官方介绍文档:https://npm.taobao.org/ ,使用命令在这个官方文档里查询. 安装工具cnpm: $ npm install -g cnpm --registry=ht ...

  3. php在Nginx环境下进行刷新缓存立即输出,实现常驻进程轮询。

    以下面这段代码并不会逐个输出,而是当浏览器筹够一定字节数进行统一输出,结果显而易见,10秒后一次性输出所有内容 for($i=0;$i<10;$i++){ echo $i.'</br> ...

  4. flash,sram

    flash写入的内容不会因电源关闭而失去,读取速度慢,成本较低,一般用作程序存储器或者低速数据读取的情况. sram有最快的读写速度,但电源掉落后其内容也会失去,价格昂贵,一般用作cpu的二级缓存,内 ...

  5. idata,xdata,pdata,code

    data       --->   可寻址片内ram bdata     --->  可位寻址的片内ram idata      --->   可寻址片内ram,允许访问全部内部ra ...

  6. LightOJ 1229 Treblecross(SG函数打表 + 遍历)题解

    题意:给你一串含“.”和“X”的字串,每次一个玩家可以把‘."变成“X”,谁先弄到三个XXX就赢.假如先手必赢,输出所有能必赢的第一步,否则输出0. 思路:显然如果一个X周围两格有X那么肯定 ...

  7. JavaScript权威指南2.词法结构

    字符集 1.用16位的Unicode字符集编写的,可以表示地球上通用的每一种书面语言.国际化 2.每个字符都是用两个字节表示的 3.大小写敏感:关键字.变量.函数名.标识符:HTML并不区分大小写 H ...

  8. 命令模式(head first 设计模式5)

    一.命令模式定义 命令大家都不会陌生,那么在开始命令模式之前,可以想象一下生活中的命令模式的特点: 如老板命令你完成一个OA项目是一个命令,接着看看其特点: 1.在上面的命令中,命令的执行者肯定是聪明 ...

  9. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法

    项目忽然出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Pat ...

  10. linux设置端口转发(一键设置)

    linux设置端口转发 #下载rinetd程序并进入文件夹 wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xv ...