在部署模型的时候遇到一个需要加速的问题,为了搞清楚模型调用过程中最耗时的操作以定位优化,同事告诉了我一个调优的工具,叫profile。搜集整理如下:

1. PyCharm图形化性能测试工具Profile

PyCharm提供了图像化的性能分析工具,使用方法见利用PyCharm的Profile工具进行Python性能分析。

另外,结合后面其他测试时间的=的python包以及pycharm打印出的log信息,可以知道,

运行时使用了cprofile以及其中profiler这两个工具来记录运行时间,显示统计结果的时候使用了pstats这个工具来进行表格化显示。


参考Pycharm官网的help,点击这里

可知profile工具使用有三个步骤:

A profiler runs in the following order: vmprof, yappi, cProfile.

1. 开启profiling会话

点击菜单栏中Run->Profile 'XXX脚本'或者脚本编辑器页面右击菜单栏中的Profile 'XXX脚本',然后在命令运行面板会出现类似下面的显示。

profile工具运行后,下方的输出面板会有三个项目,分别是

  1. 保存性能分析结果
  2. 停止分析
  3. 关闭分析面板

    可以看到,点击第一个保存之后,保存的位置提示,对于windows来说默认保存的地方是在:<LOCALAPPDATAPATH>\JetBrains\<product><version>/snapshots,mac自己看,命名是当前项目(project name)的名称。

2. 查看profile结果

可以看到,使用pycharm的profile可视化工具之后,结果是一个XXX.pstat文件,其中有一部分是Statistics,另一部分是Call Graph

2.1 Statistics面板


关于统计部分:

项目 描述
Name 函数名称
Call Count 当前函数被调用的次数
Time(ms) 这个函数及这个函数调用的函数总共花费的时间
Own Time(ms) 所选函数本身调用的时间

小技巧:
想在统计面板的Name列查找一个特定名称的函数/文件,可以任意点击一个cell,然后输入要搜索的东西。类似下面


另外,还可以右击每一行, Jump to the source code,跳转至源代码。函数对应的源代码就会出现在编辑框。

注意,不是所有的都可以跳转


分析的时候,可以先按照Call Count进行耗时从大到小排序,然后理清楚哪个调用了哪个,调用多次的,比如上图中调用1k多次的一般都是系统类型的调用,其他才是我们自己的,从上到下,依次去观察哪个比较耗时。

2.2 Call Graph

可以直接点击Call Graph这个tab,查看所有函数的调用关系图,也可以在Statistics面板,某个函数行右击Show On Call Graph,就可以直接跳转到该函数在Call graph图中对应位置。
如果一开始显示一堆矩形,没事,拖动/放大。

随便点点下面这些按钮,放大就对了

这些按钮的功能为(其他不重要,自己看提示的label也可以理解):

项目 描述
+ / - 用来放大/减小这个图的,也可以直接按键盘的加号键/减号键(不需要按住shift)

然后就可以看到函数调用关系图,一般最下面一行是python脚本文件,从下往上看

最底层可能会有多个脚本,无所谓,点击线条可以highlight,继续往下点就好了

2. 其他测试时间的python库

主要参考:Python的7种性能测试工具:timeit、profile、cProfile、line_profiler、memory_profiler、PyCharm图形化性能测试工具、objgraph

我这里只列举自己可能会用到的几个及相关注意事项

2.1 itemit

python内置库,不需要额外安装

>>> import timeit
>>> def fun():for i in range(100000):a = i * i>>> timeit.timeit('fun()', 'from __main__ import fun', number=1)
0.02922706632834235
>>>

timeit只输出被测试代码的总运行时间,单位为秒,没有详细的统计。

2.2 profile库

python内置库,不需要额外安装。

纯Python实现的性能测试模块,接口和cProfile一样。

用的时候直接把要测试的部分包在一个函数里,使用profile.run("XX()")即可,默认使用标准名称排序

>>> import profile
>>> def fun():for i in range(100000):a = i * i>>> profile.run('fun()')5 function calls in 0.031 secondsOrdered by: standard namencalls  tottime  percall  cumtime  percall filename:lineno(function)1    0.000    0.000    0.000    0.000 :0(AddPath)1    0.000    0.000    0.000    0.000 :0(Execute)1    0.000    0.000    0.000    0.000 :0(POINTER)38    0.000    0.000    0.016    0.000 :0(__build_class__)1    0.000    0.000    0.000    0.000 :0(__deepcopy__)14/6    0.000    0.000    0.016    0.003 :0(__import__)5    0.000    0.000    0.000    0.000 :0(__new__)4    0.016    0.004    0.016    0.004 :0(_abc_init)25    0.000    0.000    0.000    0.000 :0(_fix_co_filename)2    0.000    0.000    0.000    0.000 :0(_getframe)7    0.000    0.000    0.000    0.000 :0(acquire)130    0.000    0.000    0.000    0.000 :0(acquire_lock)18    0.000    0.000    0.000    0.000 :0(add)52    0.000    0.000    0.000    0.000 :0(allocate_lock)>>>
  • ncall:函数运行次数
  • tottime: 函数的总的运行时间,减去函数中调用子函数的运行时间
  • 第一个percall:percall = tottime / nclall
  • cumtime:函数及其所有子函数调整的运行时间,也就是函数开始调用到结束的时间。
  • 第二个percall:percall = cumtime / nclall

但是这里排序是按照函数名称排序的,如果希望按照运行时间排序,可以使用

# 查看被调用次数最多的
profile.run('fun()',sort="cumulative")
# 查看耗时最长的
profile.run('fun()',sort="tottime")

可以使用的sort参数的取值有:

‘calls’ call count
‘cumulative’ cumulative time
‘cumtime’ cumulative time
‘file’ file name
‘filename’ file name
‘module’ file name
‘ncalls’ call count
‘pcalls’ primitive call count
‘line’ line number
'name’function name
'nfl’name/file/line
'stdname’standard name
'time’internal time
'tottime’internal time

参考:

  • Python3 标准库概览

相对于 timeit 的细粒度,:mod:profile 和 pstats 模块提供了针对更大代码块的时间度量工具。

  • Python的Profile概述

Pycharm图形化性能测试工具Profile相关推荐

  1. Centos 7 安装Redis 6 使用Redis Desktop Manager图形化管理工具

    Centos 7 安装Redis 6 使用Redis Desktop Manager图形化管理工具 1.下载安装 进入Linux /opt目录 下载redis wget http://download ...

  2. 网络协议图形化分析工具EtherApe

    网络协议图形化分析工具EtherApe 在对网络数据分析的时候,渗透测试人员往往只关心数据流向以及协议类型,而不关心具体数据包的内容.因为这样可以快速找到网络的关键节点或者重要的协议类型. Kali ...

  3. MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  4. Docker图形化管理工具之Portainer

    What is Portainer? Portainer是一款轻量级的图形化管理工具,通过它我们可以轻松管理不同的docker环境.Portainer部署和使用都非常的简单,它由一个可以运行在任何do ...

  5. Git图形化管理工具

    Git图形化管理工具 注意:必须在创建的仓库中进行右键打开 复制这段内容后打开百度网盘App,操作更方便哦. 链接:https://pan.baidu.com/s/1eXIk01LXSmzmXvYfw ...

  6. win10下最新MySQL8.0安装与环境配置,Navicat图形化管理工具连接,完整详细可收藏

    文章目录 一.MySQL的卸载 二.MySQL的下载安装和配置 三.MySQL的开启和登录 四.MySQL图形化管理工具 一.MySQL的卸载 步骤1:停止MySQL服务 在卸载之前,先停止MySQL ...

  7. MySQL运算符,函数,索引,图形化管理工具

    文章目录 运算符 算术运算符 比较运算符 逻辑运算符 MySQL运算符 数字函数 字符串函数 日期时间函数 条件函数 系统信息函数 加密函数 其他常用函数 MySQL索引 索引的概念 索引的分类 创建 ...

  8. python图形化编程工具哪个好_mPython(图形化编程软件) V0.5.0 官方版

    mPython 是一款针对Python 3编程语言的图形化编辑工具.支持函数,仿真.hex.python.blockly三种代码读写等功能.并可以与TPYBoard系类开发板配合使用,直接连接PC端进 ...

  9. Oracle图形化管理工具——OEM

    Oracle图形化管理工具--OEM 在工作中 由于切换数据库服务器 ,由于服务器性能较低,想着调整sql,这时候就考虑使用oracle 管理工具来监控sql 参考博客: https://blog.c ...

最新文章

  1. 《暗时间》前两篇的笔记和总结
  2. PHP扩展开发 - 构建第一个PHP扩展
  3. chrome 70 android,Android版Chrome Beta 70 (70.0.3538.17) 已发布
  4. 手动挡五个档位示意图_★手动挡汽车档位图解
  5. 解决Navicat for MySQL 连接 Mysql 8.0.13出现1251- Client does not support authentication protocol 错误
  6. 微信5.0安卓内测版下载
  7. 几款用于防破解的软件
  8. 装饰器结构应用与基本使用(611)
  9. cadence/allegro文件不能双击直接打开解决办法
  10. Java实现四则运算
  11. 将10件商品的英文名称存储在数组中,输出名称的第3个字符是‘b‘的所有商品英文名称;再输出名称的长度小于6个字符的商品英文名称。
  12. windows下延时函数
  13. 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等
  14. 新浪微博爬虫-抓取用户发布的微博
  15. Prediction of Multidrug-Resistant TB from CT Pulmonary Images Based on Deep Learning Techniques论文总结
  16. 【 失踪人口回归】新·学期
  17. 基于STC89C52单片机的智能窗帘
  18. 基于Matlab使用到达时差 (TDOA) 跟踪对象仿真(附源码)
  19. 八、【服务器】服务器硬件名称中英文汇总1
  20. 局域网的网络硬件主要包括有什么

热门文章

  1. 图片的不同分类以及特性
  2. 数据库课程设计-人事管理系统
  3. 中国十大特色购物网站
  4. 从0到1学习CTF WEB
  5. 云服务器被植入挖矿木马,CPU飙升200%
  6. 一个大型网站SEO——搜索引擎优化方案
  7. 腾讯QQ2006正式 狂人DIY版 Ver20070120
  8. 在DreamSpark上从Microsoft获得免费的学生软件
  9. Eclipse快捷键大全(转载)
  10. Laravel5.4注册登录解析及使用教程