使用line_profiler查看api接口函数每行代码执行时间

使用line_profiler查看api接口函数每行代码执行时间

大家好,又见面了,我是全栈君。

项目情景描述

  在restful架构风格的项目交付测试的过程中,某接口出现 请求超时导致的http 502 Bad Gateway,于是开始排查具体是接口函数中的哪行代码或函数 响应时间过长导致的502错误

刚开始的解决方法:

  土鳖式的导入 time模块进行时间计算,从而查出具体响应时间过长的位置

  如下:

 1 import time import time
 2 from flask import Flask
 3 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:utf8
 2 from flask import Flask, jsonify
 3 import time
 4 from functools import wraps
 5 from line_profiler import LineProfiler
 6 
 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
18
19
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('/line_test')
    23                                           @func_line_time
    24                                           def line_test():
    25         6         33.0      5.5      0.0      for item in range(5):
    26         5    5005225.0 1001045.0     66.7          time.sleep(1)
    27         6         31.0      5.2      0.0      for item in xrange(5):
    28         5    2502696.0 500539.2     33.3          time.sleep(0.5)
    29         1        282.0    282.0      0.0      return jsonify({
   
   'code':200})

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:utf8
 2 import cgi
 3 import time
 4 from line_profiler import LineProfiler
 5 
 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('/line_test')
    23                                           @func_line_time
    24                                           def line_test():
    25         6         33.0      5.5      0.0      for item in range(5):
    26         5    5005225.0 1001045.0     66.7          time.sleep(1)
    27         6         31.0      5.2      0.0      for item in xrange(5):
    28         5    2502696.0 500539.2     33.3          time.sleep(0.5)
    29         1        282.0    282.0      0.0      return jsonify({
   
   'code':200})

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

  

转载于:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_603days.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107681.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码[通俗易懂]

    PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码

    2022年1月29日
    51
  • 单射、满射、双射(一一映射)

    单射、满射、双射(一一映射)设函数f:X->Y,y=f(x)单射:任给x1和x2属于X,若x1≠x2,则f(x1)≠f(x2),称f为单射满射:任给y属于Y,都存在x属于X使得f(x)=y,称f为满射双射:若f既是单射又是满射,称f为双射,也叫一一对应。

    2022年5月1日
    335
  • web开发excel文件上传及解析(下)

    web开发excel文件上传及解析(下)

    2021年8月2日
    54
  • Tabnine Pro激活码【2021最新】

    (Tabnine Pro激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    445
  • 关键部分CCriticalSection使用

    关键部分CCriticalSection使用类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如,在链表中添加一个结点就仅仅同意一次一个线程进行。通过使用CCriticalSection对象来控制链表,就能够达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了执行线程的权力,而把其他线程统统堵…

    2022年7月20日
    16
  • WebStorm安装教程【2022年新版图解】

    WebStorm安装教程【2022年新版图解】对于入门JavaScript开发的者,最重要的就是安装WebStorm软件,一款非常优秀的JavaScript工具,在互联网上查询目前还没有一篇写得比较详细的WebStorm教程。今天我将使用WebStorm最新2022年版本,从下载到安装以及创建项目带大家完整的走一遍;一、WebStorm下载1、百度搜索查询WebStorm官网;认准官网网址,别在下载站下载可能会捆绑很多垃圾软件;2、打开WebStorm官网主介绍页面,点击“Download”进入下载页面;3、点击“Download”后就跳

    2022年6月16日
    86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号