line_profile逐行代码分析
使用line_profiler查看api接口函数每行代码执行时间
</div>
项目情景描述:
在restful架构风格的项目交付测试的过程中,某接口出现 请求超时导致的http 502 Bad Gateway,于是开始排查具体是接口函数中的哪行代码或函数 响应时间过长导致的502错误。
刚开始的解决方法:
土鳖式的导入 time模块进行时间计算,从而查出具体响应时间过长的位置
如下:
1 import time import time2 from flask import Flask3 app = Flask(__name__)4 5 app.route('/line_test')6 def line_test():7 #土鳖方法8 first_time=time()9 for item in range(5): 10 time.sleep(1) 11 #土鳖方法 12 print time()-first_time 13 for item in xrange(5): 14 time.sleep(0.5) 15 #土鳖方法 16 print time()-first_time
方法缺点:需要大量时间编写 关于 time()的代码,最后还要删除这些代码,浪费时间
现在的解决方法:
使用python的 line_profiler 模块,此模块是用来测试 函数 每行代码的响应时间等情况。
具体思路:将 line_profiler相关函数封装在装饰器 中 进行使用,这样 在接口请求时,则会执行此装饰器并打印出结果。
windows安装方法:https://www.lfd.uci.edu/~gohlke/pythonlibs/#line_profiler
代码如下:
1 #coding:utf82 from flask import Flask, jsonify3 import time4 from functools import wraps5 from line_profiler import LineProfiler6 7 #查询接口中每行代码执行的时间8 def func_line_time(f):9 @wraps(f) 10 def decorator(*args, **kwargs): 11 func_return = f(*args, **kwargs) 12 lp = LineProfiler() 13 lp_wrap = lp(f) 14 lp_wrap(*args, **kwargs) 15 lp.print_stats() 16 return func_return 17 return decorator 1819 20 app = Flask(__name__) 21 22 @app.route('/line_test') 23 @func_line_time 24 def line_test(): 25 for item in range(5): 26 time.sleep(1) 27 for item in xrange(5): 28 time.sleep(0.5) 29 return jsonify({'code':200}) 30 31 if __name__=='__main__': 32 app.run()
当浏览器请求接口时得到的结果如下:
* Running on http://127.0.0.1:5000/ Timer unit: 1e-06 s
Total time: 7.50827 s
File: /home/rgc/baidu_eye/carrier/test/flask_line_profiler_test.py
Function: line_test at line 22
Line # Hits Time Per Hit % Time Line Contents
22 @app.route(<span style="color: #800000;">'</span><span style="color: #800000;">/line_test</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span>23<span style="color: #000000;"> @func_line_time
</span>24 <span style="color: #0000ff;">def</span><span style="color: #000000;"> line_test():
</span>25 6 33.0 5.5 0.0 <span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span> range(5<span style="color: #000000;">):
</span>26 5 5005225.0 1001045.0 66.7 time.sleep(1<span style="color: #000000;">)
</span>27 6 31.0 5.2 0.0 <span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span> xrange(5<span style="color: #000000;">):
</span>28 5 2502696.0 500539.2 33.3 time.sleep(0.5<span style="color: #000000;">)
</span>29 1 282.0 282.0 0.0 <span style="color: #0000ff;">return</span> jsonify({<span style="color: #800000;">'</span><span style="color: #800000;">code</span><span style="color: #800000;">'</span>:200<span style="color: #000000;">})
127.0.0.1 - - [05/Mar/2018 15:58:21] “GET /line_test HTTP/1.1” 200 -
返回结果中 具体 含义:
Total Time:测试代码的总运行时间
Line:代码行号
Hits:表示每行代码运行的次数
Time:每行代码运行的总时间
Per Hits:每行代码运行一次的时间
% Time:每行代码运行时间的百分比
从 中便可看到 具体 26行代码执行时间最长。
方法优点:只需要添加一个装饰器,再接口函数前引用即可,删除也容易,且 装饰器可以重复使用,节省大量时间。
其他关于line_profiler的使用方法:
在脚本中使用此方法:
1 #coding:utf82 import cgi3 import time4 from line_profiler import LineProfiler5 6 def test2():7 print 'hello!test2()'8 9 def test1(): 10 html='''<script>alert("you are a good boy!&I like you")</scrpit>''' 11 test2() 12 escape_html=cgi.escape(html) 13 for item in range(5): 14 time.sleep(1) 15 print escape_html 16 17 if __name__=='__main__': 18 lp=LineProfiler() 19 #同时显示函数每行所用时间和调用函数每行所用时间,加入add_function() 20 lp.add_function(test2) 21 lp_wrap=lp(test1) #如果被测函数有入参,下面一行为 lp_wrap(被测函数入参) 22 lp_wrap() 23 lp.print_stats()
直接运行显示结果:
* Running on http://127.0.0.1:5000/ Timer unit: 1e-06 s
Total time: 7.50827 s
File: /home/rgc/baidu_eye/carrier/test/flask_line_profiler_test.py
Function: line_test at line 22
Line # Hits Time Per Hit % Time Line Contents
22 @app.route(<span style="color: #800000;">'</span><span style="color: #800000;">/line_test</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span>23<span style="color: #000000;"> @func_line_time
</span>24 <span style="color: #0000ff;">def</span><span style="color: #000000;"> line_test():
</span>25 6 33.0 5.5 0.0 <span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span> range(5<span style="color: #000000;">):
</span>26 5 5005225.0 1001045.0 66.7 time.sleep(1<span style="color: #000000;">)
</span>27 6 31.0 5.2 0.0 <span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span> xrange(5<span style="color: #000000;">):
</span>28 5 2502696.0 500539.2 33.3 time.sleep(0.5<span style="color: #000000;">)
</span>29 1 282.0 282.0 0.0 <span style="color: #0000ff;">return</span> jsonify({<span style="color: #800000;">'</span><span style="color: #800000;">code</span><span style="color: #800000;">'</span>:200<span style="color: #000000;">})
127.0.0.1 - - [05/Mar/2018 15:58:21] “GET /line_test HTTP/1.1” 200 -
相对于另一种使用方法:
1.在需要测试的函数前添加装饰器 @profile
2.启动程序 $kernprof -l -v test.py
无需 实际运行项目时删除@profile,如需单独测试此函数,直接使用 if __name__=='__main__': 即可,这样在其他函数引用时,不会执行line_profiler相关代码。
相关博客:
http://blog.csdn.net/guofangxiandaihua/article/details/77825524
<div id="blog_post_info">
关注 - 0
粉丝 - 7
<div class="clear"></div>
<div id="post_next_prev"><a href="https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_327days.html" class="p_n_p_prefix">« </a> 上一篇: <a href="https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_327days.html" title="发布于 2018-01-01 19:39">前端js,后台python实现RSA非对称加密</a>
<br>
<a href="https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_603days_1.html" class="p_n_p_prefix">» </a> 下一篇: <a href="https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_603days_1.html" title="发布于 2018-03-05 21:54">memory_profiler的使用</a>
加上之后多进程就编程单进程了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190927094932102.jpg)
line_profile逐行代码分析相关推荐
- 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)
微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...
- 静态代码分析工具简介
静态代码分析工具简介 什么是静态代码分析 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句 ...
- 20145236《网络攻防》Exp4 恶意代码分析
20145236<网络攻防>Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些 ...
- C#中类的继承 override virtual new的作用以及代码分析
继承中override virtual new的作用 virtual 父类中需要注明允许重写的方法: override 子类中必须显示声明该方法是重写的父类中的方法: new 子类中忽略父类的已存在的 ...
- 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用
配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + ...
- lighttpd1.4.18代码分析
lighttpd1.4.18代码分析(八)--状态机(2)CON_STATE_READ状态 posted @ 2008-09-24 10:50 那谁 阅读(2225) | 评论 (1) 编辑 lig ...
- Device Tree(三):代码分析
2019独角兽企业重金招聘Python工程师标准>>> 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请 ...
- 使用Hadoop和ELK进行业务代码分析!分分钟捉到Bug!
大数据是计算领域的新高地,它有望提供一种方法来应对二十一世纪不断增长的数据生成.越来越多的大数据爱好者正在涌现,越来越多的公司正在采用各种大数据平台,并希望提出以客户为中心的解决方案,帮助他们在竞争激 ...
- 20145328 《网络对抗技术》恶意代码分析
20145328 <网络对抗技术>恶意代码分析 ------看到这句话说明还没写完-------- 实践内容: 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用 ...
最新文章
- react 开源项目_无良老板拖欠程序员工资,一怒开源冲上 GitHub TOP1
- Linux 平台一种进程代码注入方法
- 视频光端机维护三大步骤
- linux系统硬件配置查看方法
- 启动优化之Android-Startup
- 机器学习:考试预测实战(特征隐射,独热编码,特征重要性选择,网格搜索调参)
- RK系列开发板音频驱动适配指南(二)
- 在PyCharm中大型数据集indexing...加载缓慢的问题
- bp神经网络推导以及物理意义
- 视频教程-沐风老师3DMAX室内建模挤出法详解-3Dmax
- 10个流行常用的Django第三方包-大江狗推荐
- 专知 2019/4/24(图像填充方法大全)
- 学完高性能计算后的发展怎么样?
- UltraEdit连接linux中文乱码,UltraEdit显示中文乱码的解决办法
- 常用转接IC,转接芯片整理汇总
- linux中的manifest的作用,Manifest用途
- Cisco路由器配置教程
- Abaqus与Ansys的区别和不同, 两种软件哪个更好?
- java jsp 汽车销售管理系统
- oracle修改clob值,oracle修改字段类型由varchar2修改为clob类型
热门文章
- 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)
- 简单解决用VS编写hello world时命令行一闪而过
- php多表存储,php – MySql在一个单元格中存储另一个表的多个引用并选择它?
- 2022-2028年中国内衣用热熔胶膜行业发展现状调查及市场分析预测报告
- 2018年终总结:自由而独立
- 【VB】学生信息管理系统2——窗体设计
- Pytorch源码与运行原理浅析--网络篇(一)
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
- Pass Infrastructure基础架构(上)
- 通往安全自动驾驶汽车的艰难道路