使用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接口 ... 
随机推荐
- ueditor表格边框没有颜色的解决
			问题: 用ueditor画表格,会发现表格存在,但是表格边框没有颜色. 解决方法: 需要对js文件中的样式进行修改,这里我引用的编辑器样式文件是ueditor.all.min.js,所以先找到该文件, ... 
- struts2 添加请求后缀的3种方式
			第一种方式在struts.xml文件中添加 <constant name="struts.action.extension" value="">&l ... 
- jsp中 scope="application" 表示
			jsp中 <jsp:useBean id="countbean" scope="application" class="count.counte ... 
- 用Markdown格式写一份前端简历
			1. 基本信息 姓名:xxx 手机号码:1380000xxxx 学校:南昌大学 学历:大学本科/硕士/博士 工作经验:3年以上Web前端 电子邮件:xxx@outlook.com 2. 求职意向 工作 ... 
- 02_HTML5+CSS详解第三天
			WebStorage简单的网页留言板用到的函数有3个1.saveStorage函数使用"new Date().getTime()"语句来获取当前的日期和时间戳,然后使用localS ... 
- Win10微软帐户切换不回Administrator本地帐户的解决方法--(转,虽转但亲测有效)
			在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ... 
- Win10图片打开方式没有“Windows照片查看器”,如何找回?
			如果你是全新安装的Win10正式版,那么就会发现当在图片上点击右键时,"打开方式"菜单里熟悉的"Windows照片查看器"不见了,换成了Win10全新的&quo ... 
- 刚买个炼狱蝰蛇1800dpi的下完驱动提示没有发现鼠标
			2017-02-19补充:可以下载下面的程序 ,也可以访问 http://cn.razerzone.com/synapse/ 下载雷云 也可解决问题 ------------------------ ... 
- Yii框架中使用mongodb扩展
			前提条件:安装了mongodb数据库 安装了mongo的php驱动 下载Yii的mongo扩展:这是YiiMongoDbSuite的1.3.6版本支持PHP Mongo驱动的版本为1.0.5及以下 下 ... 
- ABP官方文档翻译 4.6 审计日志
			审计日志 介绍 关于IAuditingStore 配置 通过特性启用/禁用 注意事项 介绍 维基百科:“审计追踪(也称为审计日志)是与安全相关的按时间先后的记录.记录集合.记录的目的地和源,提供一系列 ... 
