使用line_profiler查看api接口函数每行代码执行时间
项目情景描述:
在restful架构风格的项目交付测试的过程中,某接口出现 请求超时导致的http 502 Bad Gateway,于是开始排查具体是接口函数中的哪行代码或函数 响应时间过长导致的502错误。
刚开始的解决方法:
土鳖式的导入 time模块进行时间计算,从而查出具体响应时间过长的位置
如下:
import time import time
from flask import Flask
app = Flask(__name__) app.route('/line_test')
def line_test():
#土鳖方法
first_time=time()
for item in range(5):
time.sleep(1)
#土鳖方法
print time()-first_time
for item in xrange(5):
time.sleep(0.5)
#土鳖方法
print time()-first_time
方法缺点:需要大量时间编写 关于 time()的代码,最后还要删除这些代码,浪费时间
现在的解决方法:
使用python的 line_profiler 模块,此模块是用来测试 函数 每行代码的响应时间等情况。
具体思路:将 line_profiler相关函数封装在装饰器 中 进行使用,这样 在接口请求时,则会执行此装饰器并打印出结果。
windows安装方法:https://www.lfd.uci.edu/~gohlke/pythonlibs/#line_profiler
代码如下:
#coding:utf8
from flask import Flask, jsonify
import time
from functools import wraps
from line_profiler import LineProfiler #查询接口中每行代码执行的时间
def func_line_time(f):
@wraps(f)
def decorator(*args, **kwargs):
func_return = f(*args, **kwargs)
lp = LineProfiler()
lp_wrap = lp(f)
lp_wrap(*args, **kwargs)
lp.print_stats()
return func_return
return decorator
18 app = Flask(__name__) @app.route('/line_test')
@func_line_time
def line_test():
for item in range(5):
time.sleep(1)
for item in xrange(5):
time.sleep(0.5)
return jsonify({'code':200}) if __name__=='__main__':
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的使用方法:
在脚本中使用此方法:
#coding:utf8
import cgi
import time
from line_profiler import LineProfiler def test2():
print 'hello!test2()' def test1():
html='''<script>alert("you are a good boy!&I like you")</scrpit>'''
test2()
escape_html=cgi.escape(html)
for item in range(5):
time.sleep(1)
print escape_html
if __name__=='__main__':
lp=LineProfiler()
#同时显示函数每行所用时间和调用函数每行所用时间,加入add_function()
lp.add_function(test2)
lp_wrap=lp(test1)
#如果被测函数有入参,下面一行为 lp_wrap(被测函数入参)
lp_wrap()
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
使用line_profiler查看api接口函数每行代码执行时间的更多相关文章
- Linux平台下利用系统接口函数按照行读写文件
要求:支持大文件(1M)一次性读入 源代码如下: #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #i ...
- Visual Studio 2010/2013 查看DLL接口(函数)
1. “应用程序" Visual Studio 2010/2013 的Visual Studio Tools文件夹中打开Visual Studio Command Prompt 命令提示窗口 ...
- 在C++里一个类成员函数多少行代码才是最好呢?
这个问题,很多同事以及学生都问我这个问题.其实这是一个比较实际的问题,因为设计一个类成员函数的好与坏,决定了一个类代码的质量. 为了回答这个问题,昨晚又重新看看斯坦福大学的编程视频,可以用下面这个截图 ...
- Python+moviepy使用manual_tracking和headblur函数10行代码实现视频人脸追踪打马赛克
☞ ░ 前往老猿Python博文目录 ░ 一.背景知识 1.1.headblur简介 追踪人脸打马赛克需要使用headblur函数. 调用语法: headblur(clip,fx,fy,r_zone, ...
- 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip
<?php //获取文件列表 function list_dir($dir){ $result = array(); if (is_dir($dir)){ $file_dir = scandir ...
- SQLite3开发接口函数详解
SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API. SQLite3是为了满足以下的需求而开发的: ...
- Linux内核驱动之GPIO子系统API接口概述
1.前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制 ...
- onps栈使用说明(1)——API接口手册
1. 底层API 由协议栈底层提供的api,用于涉及底层操作的一些功能实现,这些api接口函数的原型定义分布于不同的文件,它们被统一include进了onps.h中: open_npstack_loa ...
- libEasyPlayer RTSP windows播放器SDK API接口设计说明
概述 libEasyPlayer实现对RTSP直播流进行实时采集和解码显示,稳定,高效,低延时:解码可采用intel硬件解码和软件解码两种方式,能实时进行录像和快照抓图,OSD叠加等功能. API接口 ...
随机推荐
- 错误:Invalid action class configuration that references an unknown class named [XXX]的解决
问题: 用http的方式直接调用类,执行完毕后报错误信息Invalid action class configuration that references an unknown class name ...
- fopen()函数参数
摘自百度百科.... 1."r" = "rt" 打开一个文本文件,文件必须存在,只允许读 2."r+" = "rt+&qu ...
- 【socket编程】select manual page翻译
原文: select manual page 依赖的头文件 /* According to POSIX.1-2001, POSIX.1-2008 */ #include <sys/select. ...
- C++——函数的调用
调用前先声明函数: >>若函数定义在调用点之前,则无需另外声明 >>若函数定义在调用点之后,则需要在调用函数前按如下形式声明函数原型(原型声明) 类型标识符 被调用函数名( ...
- Core Animation 文档翻译 (第六篇)
高级动画技巧 配置属性动画或者关键帧动画的方式是多种多样的.需要同时执行多个动画或者顺序执行多个动画的APP,可以通过高级的方式同步这些动画的timing或者将这些动画绑定在一起.我们也可以使用其 ...
- 01_什么是数据结构以及C语言指针回顾
一.数据结构是什么 如何把现实中大量而复杂的问题,以特定的数据类型和特定的数据存储结构保存到计算机的存储器中. 数据存储包括两方面:个体存储的集合.个体与个体之间的关系的存储 程序 = 算法 + 数据 ...
- 分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中
今天学习分析ajax 请求,现把学得记录, 把我们在今日头条搜索街拍美图的时候,今日头条会发起ajax请求去请求图片,所以我们在网页源码中不能找到图片的url,但是今日头条网页中有一个json 文件, ...
- cdh版本的hue安装配置部署以及集成hadoop hbase hive mysql等权威指南
hue下载地址:https://github.com/cloudera/hue hue学习文档地址:http://archive.cloudera.com/cdh5/cdh/5/hue-3.7.0-c ...
- 洛谷 [P251] 餐巾计划问题
有上下界的最小费用最大流 可以联想到供求平衡问题,所以我们要拆点做这道题 把每天分为二分图两个集合中的顶点Xi,Yi,建立附加源S汇T. 1.从S向每个Xi连一条容量为ri,费用为0的有向边. 2.从 ...
- 整理一点与排列组合有关的问题[组合数 Stirling数 Catalan数]
都是数学题 思维最重要,什么什么数都没用,DP直接乱搞(雾.. 参考LH课件,以及资料:http://daybreakcx.is-programmer.com/posts/17315.html 做到有 ...