Python性能分析工具py-spy原理用法解析


Posted in Python onJuly 27, 2020

Py-Spy介绍

引用官方的介绍:

Py-Spy是Python程序的抽样分析器。 它允许您可视化查看Python程序在哪些地方花了更多时间,整个监控方式无需重新启动程序或以任何方式修改工程代码。 Py-Spy的开销非常低:它是用Rust编写的,速度与编译的Python程序不在同一个进程中运行。 这意味着Py-Spy可以安全地用于生成生产环境中的Python应用调优分析。

github:https://github.com/benfred/py-spy

安装

pip install py-spy

安装后使用py-spy - h可以验证安装,并查看使用帮助。

py-spy从命令行工作,并获取要从中采样的程序的PID或要运行的python程序的命令行。py-spy具有三个子命令record,top和dump:

  • record生成火焰图
  • top实时查看每个函数运行时间并统计
  • dump显示每个python线程的当前调用堆栈

Python性能分析工具py-spy原理用法解析

使用py-spy 生成火焰图

​ py-spy是一个非常好用而且简单的库,看完他的readme 介绍文档基本就可以入手使用spy。这个工具一是可以生成profile 火焰图,二是可以定位到程序中最耗时间的代码的位置。它的优点在于完全不用修改代码,相比较其他的一些性能调查工具,py-spy这一点非常棒,当你debug 一个线上正在运行的程序的时候,只需要提供进程id,py-spy 就可以直接生成火焰图。

py-spy record -o profile.svg --pid 12345

或者

py-spy record -o profile.svg-python myprogram.py

"12345" 为程序运行的pid,当运行这行命令的时候,py-spy 开始抽样的程序simlple 并且生成火焰图,我们可以等待1分钟左右 ctrl+c 结束,这时候会在运行这行命令的当前目录下生成 profile.svg 火焰图, 如下图:

Python性能分析工具py-spy原理用法解析

火焰图的分析非常简单直观,主要是看"平顶",看图中最下方那个峰顶是平的,那么程序的性能问题就可以从这里入手去解决,这里不详细介绍火焰图看法,不明白的同学可以自行百度。

​ 通过生成火焰图分析程序瓶颈大概率可以找到并解决80%的程序性能问题,但是还有一种问题,如果我的火焰图没有平顶,但是程序依旧很慢,该如何定位问题?

没有平顶情况下,定位程序中耗时最多函数/代码

如下图,通过火焰图并没有发现程序中的平顶

Python性能分析工具py-spy原理用法解析

Top功能

这时候要用到py-spy 提供的 top 命令,Top显示了在python程序中花费最多时间的功能的实时视图,类似于unix top命令。

py-spy top --pid 12345

py-spy top-python myprogram.py

​ 输入上述命令后,在控制台会显示程序实时的运行状态,这里可以介绍一下图中4个参数的含义, 然后可以通过按1,2,3,4 四个按键,让程序按照下图所述排序。

  • 按%Own排序(当前在该函数中花费的时间的百分比)
  • 按%Total排序(函数及其子级中当前的时间百分比)
  • 按OwnTime排序(函数中花费的总时间)
  • 按TotalTime排序(该函数及其子项花费的总时间)

比较直观的 使用3 , 可以比较直接的看出程序运行中,所占比消耗时间最多的函数,然后从函数如图进行分析,如下图,可以看出 是wrap 装饰器函数消耗的时间最长,我们用wrapt 这个c写的装饰器进行替换后效率有了明显的提升。

Python性能分析工具py-spy原理用法解析

总结 : 使用py-spy 相对于其他一些python性能分析工具,优势在于使用非常简单,而且无须对代码做任何改动,并且可以在保护现场情况下,直接生成火焰图,还可查看实时程序运行状态。

火焰图怎么看

首先你需要知道:

X方向是采样时间。

Y方向是函数调用栈。

如果给你一个这样的火焰图,你应该得出什么信息:

1.a()是开始的执行函数,但没有消耗cpu,在这个函数里执行了b(),h()。

2.a()的两个分支b()和h(),这表明a()里面可能有一个条件语句,继续可以看到b()分支消耗的 CPU 大大高于h()。

3.h()函数没有消耗cpu,cpu全被i()函数占有。

4.b()函数这条支路继续往上,一直到d(),由d()函数的子函数e()消耗一部分cpu,f()下的g()消耗一部分cpu,你会发现d()的最右边往上缺了一块,这块就是d()执行消耗的cpu。

结论:

消耗cpu的函数为e(),g(),d(),i()。

因此,如果要调查性能问题,首先应该调查g(),其次是i()。

Python性能分析工具py-spy原理用法解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中enumerate的用法实例解析
Aug 18 Python
Python中使用select模块实现非阻塞的IO
Feb 03 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
pygame实现成语填空游戏
Oct 29 Python
Python bytes string相互转换过程解析
Mar 05 Python
Numpy 多维数据数组的实现
Jun 18 Python
python time()的实例用法
Nov 03 Python
如何用python绘制雷达图
Apr 24 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 Python
python下载的库包存放路径
Jul 27 #Python
Python基础教程之输入输出和运算符
Jul 26 #Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 #Python
利用Python实现斐波那契数列的方法实例
Jul 26 #Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 #Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 #Python
python如何支持并发方法详解
Jul 25 #Python
You might like
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
vue深入解析之render function code详解
2017/07/18 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
Python3离线安装Requests模块问题
2019/10/13 Python
python 发送json数据操作实例分析
2019/10/15 Python
Python matplotlib实时画图案例
2020/04/23 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
简历中自我评价范文3则
2013/12/14 职场文书
职业生涯规划设计步骤
2014/01/12 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
离婚代理词范文
2015/05/23 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电