python-性能测试
目录:
2.3 line_profiler 逐行分析代码耗时
2.4 memory profiler 逐行分析代码占用内存
1.timeit python标准库自带
其算法如下:
- 将代码循环之行多次(参数名number),以便有足够长的统计时间。
- 将步骤 1 循环执行多次(参数名repeat),获取足够多的有统计采样。
- 从步骤 2 的结果选取耗时最短的采样,计算单次平均值。
1.1命令行执行
(djProj_py3) appledeMacBook-Air-7:tests apple$ python -m timeit -r 3 -s "import time" "time.sleep(1)"
10 loops, best of 3: 1 sec per loop
1.2 在代码中调用
1.3创建计时器实例,可以使用autorange方法探测合适的循环次数
In [4]: import timeit
In [5]: t = timeit.Timer("time.sleep(0.002)", "import time")
In [6]: t.autorange()
Out[6]: (100, 0.2527182700000594)
1.4 默认使用高精度计时器统计Wall时间,也可以改为统计CPU时间。
参数名 timer: Wall -- time.perf_counter
CPU -- time.process_time
timeit.timeit("time.sleep(1)", "import time", number=10, timer=time.process_time) # 指定统计CPU时间
2.profile和cProfile
2.1 cProfile以C实现,额外开销小。profile以python实现,相关开销大会导致测量误差较大,适合用来编写扩展分析器。
测试代码:
import time def a():
n = 0
for i in range(1000):
n += 1
time.sleep(1)
return n def b():
n = 0
for i in range(3):
n += a()
print(n)
return n if __name__ == "__main__":
b()
开始测试:
ncalls:被调用总次数
tottime: 总执行时间(不包括调用的子函数)
percall: tottime/ncalls
cumtime: 执行总时间(包括调用的子函数)
percall: cumtime / ncalls
(djProj_py3) appledeMacBook-Air-7:tests apple$ python -m cProfile -s cumtime test_a.py
3000
11 function calls in 3.010 seconds Ordered by: cumulative time
# 次数 不包括子函数 平均 包括子函数 平均
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 3.010 3.010 {built-in method builtins.exec}
1 0.000 0.000 3.010 3.010 test_a.py:1(<module>)
1 0.000 0.000 3.010 3.010 test_a.py:12(b)
3 0.000 0.000 3.010 1.003 test_a.py:4(a)
3 3.009 1.003 3.009 1.003 {built-in method time.sleep}
1 0.000 0.000 0.000 0.000 {built-in method builtins.print}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2.2 一般将cProfile封装成装饰器 或 上下文
2.2.1装饰器
def profile(sortby="cumtime", limit=1, timer=time.perf_counter):
def decorator(func):
@functools.wraps(func)
def warp(*args, **kwargs):
p = cProfile.Profile(timer)
p.enable() # 类似启动的功能
try:
return func(*args, **kwargs)
finally:
p.disable() # 类似停止
s = pstats.Stats(p).sort_stats(sortby)
s.print_stats(limit) # 限制输出几行
return warp
return decorator def a():
n = 0
for i in range(1000):
n += 1
time.sleep(1)
return n @profile()
def b():
n = 0
for i in range(3):
n += a()
return n if __name__ == "__main__":
b() >>>
(djProj_py3) appledeMacBook-Air-7:tests apple$ python test_a.py
8 function calls in 3.013 seconds Ordered by: cumulative time
List reduced from 4 to 1 due to restriction <1> ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 3.013 3.013 test_a.py:28(b)
2.2.2 上下文
import cProfile, pstats, contextlib, time @contextlib.contextmanager
def profile1(sortby='cumtime', limit=10, timer=time.perf_counter):
p = cProfile.Profile(timer)
p.enable()
try:
yield
finally:
p.disable()
s = pstats.Stats(p).sort_stats(sortby)
s.print_stats(limit) def a():
n = 0
for i in range(1000):
n += 1
time.sleep(1)
return n @profile1()
def b():
n = 0
for i in range(3):
n += a()
return n if __name__ == "__main__":
b() >>>
(djProj_py3) appledeMacBook-Air-7:tests apple$ python test_a.py
11 function calls in 3.013 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 3.013 3.013 test_a.py:39(b)
3 0.001 0.000 3.013 1.004 test_a.py:31(a)
3 3.012 1.004 3.012 1.004 {built-in method time.sleep}
1 0.000 0.000 0.000 0.000 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/contextlib.py:85(__exit__)
1 0.000 0.000 0.000 0.000 {built-in method builtins.next}
1 0.000 0.000 0.000 0.000 test_a.py:20(profile1)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2.3 line_profiler
通过上面的cProfile可以分析得到引发性能的函数,line_profiler可以对该函数代码逐行分析
首先 pip install line_profiler
@profile # 此装饰器,安装了line_profiler,才只能通过命令 kernprof -l -v test_a.py 分析每行性能
def test():
for i in range(3):
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a if __name__ == "__main__":
test() >>>
(djProj_py3) appledeMacBook-Air-7:tests apple$ kernprof -l -v test_a.py
Wrote profile results to test_a.py.lprof # -l 储存进文件 -v 显示
Timer unit: 1e-06 s
Total time: 0.147605 s
File: test_a.py
Function: test at line 40
Line # Hits Time Per Hit % Time Line Contents
==============================================================
40 @profile
41 def test():
42 4 19.0 4.8 0.0 for i in range(3):
43 3 15401.0 5133.7 10.4 a = [1] * (10 ** 6)
44 1 73001.0 73001.0 49.5 b = [2] * (2 * 10 ** 7)
45 1 59182.0 59182.0 40.1 del b
46 1 2.0 2.0 0.0 return a
2.4 memory profiler
逐行分析代码内存占用
首先 pip install memory_profiler
@profile
def test():
for i in range(3):
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a >>>
(djProj_py3) appledeMacBook-Air-7:tests apple$ python -m memory_profiler test_a.py
Filename: test_a.py Line # Mem usage Increment Line Contents
================================================
40 31.000 MiB 31.000 MiB @profile
41 def test():
42 46.266 MiB 0.000 MiB for i in range(3):
43 46.266 MiB 15.266 MiB a = [1] * (10 ** 6)
44 198.855 MiB 152.590 MiB b = [2] * (2 * 10 ** 7)
45 46.266 MiB -152.590 MiB del b
46 46.266 MiB 0.000 MiB return a
python-性能测试的更多相关文章
- python 性能测试
python中使用的性能测试模块是memory_profiler , 我们使用它里面的profile这个装饰器即可测试出我们的代码的内存使用情况了. 如果没有安装 memory_p ...
- 好用的python性能测试神器–Locust
原文链接:https://mp.weixin.qq.com/s/9PxSPuHmucSLi_welq6uNQ 现在性能测试工具太多,根据业务不同使用,比如说我们熟悉的loadrunner.jmeter ...
- Python性能测试
python -m profile xxx.py > log.txt 打开log.txt查看,搜索你所关心的方法调用耗费的时间. profile的统计结果分为ncalls.tottime.per ...
- python性能测试大致计划
hi guy: 如果注意到创建时间,那就对了.这份文章,是我学习Python一个月以后动手写的. 写下这份计划以后,只完成了第一步,其中磕磕绊绊编写代码的过程,很大一部分时间是完全用txt写的 ...
- python性能测试脚本-乾颐堂
废话不多说,直接上代码. import httplib import urllib import time import json class Transaction(object): ...
- python性能测试值timeit的使用示例
from timeit import Timer def t1(): li = [] for i in range(10000): li.append(i) def t2(): li = [] for ...
- python 各种开源库
测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. 链接 sel ...
- python 三方面库整理
测试开发 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. –推荐 mechanize- Python中有状 ...
- python测试框架&&数据生成&&工具最全资源汇总
xUnit frameworks 单元测试框架frameworks 框架unittest - python自带的单元测试库,开箱即用unittest2 - 加强版的单元测试框架,适用于Python 2 ...
- Python代码样例列表
扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│ Python用户推荐系统曼哈顿算法实现.py│ ...
随机推荐
- ThinkPHP 介绍及安装 -1
一.ThinkPHP的介绍 MVC M - Model 模型 工作:负责数据的操作 V - View 视图(模板) 工作:负责前台页面显示 C - Con ...
- tomcat源码 Connector
Connector容器主要负责解析socket请求,在tomcat中的源码位于org.apache.catalina.connector和org.apache.coyote包路径下:通过上两节的分析, ...
- 数据仓库专题(5)-如何构建主题域模型原则之站在巨人的肩上(二)NCR FS-LDM主题域模型划分
一.前言 分布式数据仓库模型的架构设计,受分布式技术的影响,很多有自己特色的地方,但是在概念模型和逻辑模型设计方面,还是有很多可以从传统数据仓库模型进行借鉴的地方.NCR FS-LDM数据模型是金融行 ...
- IDEA创建Springmvc项目
项目主要步骤如下: 1.创建一个javaweb动态项目 2.导入springmvc demo所需要的jar包 3.生成项目war包 4.配置项目tomacat服务器 5.配置web.xml文件 6.编 ...
- [LeedCode]921. 使括号有效的最少添加
题目描述: 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字 ...
- elasticsearch mapping demo
curl -XPUT localhost:9200/local -d '{ "settings" : { "analysis" : { "analyz ...
- bzoj2909: Bipartite Numbers
Description Bipartite Number是这样的一个正整数,他只能由两段相同的数组成,如44444411,10000000, 5555556,41,而4444114,44444则不是. ...
- CSS3 圆角(border-radius)
值:半径的长度 前缀 -moz(例如 -moz-border-radius)用于Firefox -webkit(例如:-webkit-border-radius)用于Safari和Chrome. 例1 ...
- HEAD插件安装
简介 是一个HTML5编写的集群操作和管理工具,可以对集群进行傻瓜式操作,Head插件中可以显示集群的拓扑结构,执行索引和节点级别等操作,同时也可以输入RESTful命令和Elasticsearch交 ...
- Java泛型深入理解(转载)
原文地址 http://blog.csdn.net/sunxianghuang/article/details/51982979 泛型之前 在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将 ...