使用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

  

标签: line_profiler, python
<div id="blog_post_info">
好文要顶 关注我 收藏该文

RGC
关注 - 0
粉丝 - 7

+加关注
0
0
<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>
posted on 2018-03-05 16:36 RGC 阅读(2122) 评论(0) 编辑 收藏

加上之后多进程就编程单进程了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190927094932102.jpg)

line_profile逐行代码分析相关推荐

  1. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  2. 静态代码分析工具简介

    静态代码分析工具简介 什么是静态代码分析 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句 ...

  3. 20145236《网络攻防》Exp4 恶意代码分析

    20145236<网络攻防>Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些 ...

  4. C#中类的继承 override virtual new的作用以及代码分析

    继承中override virtual new的作用 virtual 父类中需要注明允许重写的方法: override 子类中必须显示声明该方法是重写的父类中的方法: new 子类中忽略父类的已存在的 ...

  5. 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用

    配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + ...

  6. lighttpd1.4.18代码分析

    lighttpd1.4.18代码分析(八)--状态机(2)CON_STATE_READ状态 posted @ 2008-09-24 10:50 那谁 阅读(2225) | 评论 (1)  编辑 lig ...

  7. Device Tree(三):代码分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请 ...

  8. 使用Hadoop和ELK进行业务代码分析!分分钟捉到Bug!

    大数据是计算领域的新高地,它有望提供一种方法来应对二十一世纪不断增长的数据生成.越来越多的大数据爱好者正在涌现,越来越多的公司正在采用各种大数据平台,并希望提出以客户为中心的解决方案,帮助他们在竞争激 ...

  9. 20145328 《网络对抗技术》恶意代码分析

    20145328 <网络对抗技术>恶意代码分析 ------看到这句话说明还没写完-------- 实践内容: 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用 ...

最新文章

  1. react 开源项目_无良老板拖欠程序员工资,一怒开源冲上 GitHub TOP1
  2. Linux 平台一种进程代码注入方法
  3. 视频光端机维护三大步骤
  4. linux系统硬件配置查看方法
  5. 启动优化之Android-Startup
  6. 机器学习:考试预测实战(特征隐射,独热编码,特征重要性选择,网格搜索调参)
  7. RK系列开发板音频驱动适配指南(二)
  8. 在PyCharm中大型数据集indexing...加载缓慢的问题
  9. bp神经网络推导以及物理意义
  10. 视频教程-沐风老师3DMAX室内建模挤出法详解-3Dmax
  11. 10个流行常用的Django第三方包-大江狗推荐
  12. 专知 2019/4/24(图像填充方法大全)
  13. 学完高性能计算后的发展怎么样?
  14. UltraEdit连接linux中文乱码,UltraEdit显示中文乱码的解决办法
  15. 常用转接IC,转接芯片整理汇总
  16. linux中的manifest的作用,Manifest用途
  17. Cisco路由器配置教程
  18. Abaqus与Ansys的区别和不同, 两种软件哪个更好?
  19. java jsp 汽车销售管理系统
  20. oracle修改clob值,oracle修改字段类型由varchar2修改为clob类型

热门文章

  1. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)
  2. 简单解决用VS编写hello world时命令行一闪而过
  3. php多表存储,php – MySql在一个单元格中存储另一个表的多个引用并选择它?
  4. 2022-2028年中国内衣用热熔胶膜行业发展现状调查及市场分析预测报告
  5. 2018年终总结:自由而独立
  6. 【VB】学生信息管理系统2——窗体设计
  7. Pytorch源码与运行原理浅析--网络篇(一)
  8. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
  9. Pass Infrastructure基础架构(上)
  10. 通往安全自动驾驶汽车的艰难道路