python之timeit模块
timeit模块:
timeit 模块定义了接受两个参数的 Timer 类。两个参数都是字符串。 第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。
一旦有了 Timer 对象,最简单的事就是调用 timeit(),它接受一个参数为每个测试中调用被计时语句的次数,默认为一百万次;返回所耗费的秒数。
- Timer 对象的另一个主要方法是 repeat(), 它接受两个可选参数。 第一个参数是重复整个测试的次数,第二个参数是每个测试中调用被计时语句的次数。 两个参数都是可选的,它们的默认值分别是 3 和1000000。 repeat() 方法返回以秒记录的每个测试循环的耗时列表。Python 有一个方便的 min 函数可以把输入的列表返回成最小值,如: min(t.repeat(3, 1000000))
测试一个列表推导式与for循环的时间
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import timeitfoooo = """sum = []for i in range(1000): sum.append(i)"""print(timeit.timeit(stmt="[i for i in range(1000)]", number=100000))print(timeit.timeit(stmt=foooo, number=100000))#res:#3.2855970134734345#8.19918414604134 |
使用列表推导式要比正常使用list追加元素 通过10w次循环会快上近5秒左右,速度快上近三倍。
timeit 模块抽象出了;两个可以直接使用的方法,包了一层可以让我们不用关心内部的实现,下面看一下模块里面的代码:
|
1
2
3
4
5
6
7
8
9
|
def timeit(stmt="pass", setup="pass", timer=default_timer, number=default_number): """Convenience function to create Timer object and call timeit method.""" return Timer(stmt, setup, timer).timeit(number)def repeat(stmt="pass", setup="pass", timer=default_timer, repeat=default_repeat, number=default_number): """Convenience function to create Timer object and call repeat method.""" return Timer(stmt, setup, timer).repeat(repeat, number) |
可以看到这两个方法都是对Timer类包了一层这几个参数:
stmt: 这个参数就是statement,可以把要进行计算时间的代码放在里面。他可以直接接受字符串的表达式,也可以接受单个变量,也可以接受函数。
setup: 这个参数可以将stmt的环境传进去。比如各种import和参数什么的。
timer: 这个参数一般使用不到,具体使用可以参看文档。
Timer类下面还有repeat和timeit方法 使用也非常方便就是 timeit.timeit 和 timeit.repeat。
一个就是上面例子的timeit,一个就是repeat 其实repeat就比timeit多了一个执行Timer次数的参数。这个执行次数会以数组的形式返回.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import timeitfoooo = """sum = []for i in range(1000): sum.append(i)"""print(timeit.repeat(stmt="[i for i in range(1000)]", repeat=2, number=100000))print(min(timeit.repeat(stmt="[i for i in range(1000)]", repeat=2, number=100000)))#res:#[3.4540683642063277, 3.300991128415932]#3.321008256502136 |
我们可以根据此,对所有执行时间取min最小值,平均值,最大值得到我们想要的数据。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# coding: utf-8import timeit# 初始化类x = """say_hi.ParseFromString(p)"""y = """simplejson.loads(x)"""print(timeit.timeit(stmt=x, setup="import say_hi_pb2;" "say_hi = say_hi_pb2.SayHi();" "say_hi.id = 13423;" "say_hi.something = 'axiba';" "say_hi.extra_info = 'xiba';" "p =say_hi.SerializeToString()", number=1000000))print(timeit.timeit(stmt=y, setup="import simplejson; " "json={" "'id': 13423," "'something': 'axiba'," "'extra_info': 'xiba'," "};" "x = simplejson.dumps(json)", number=1000000))<br> |
另外需要补充一点是,如果你想直接 stmt 那里执行函数。可以把函数申明在当前文件中,然后在 stmt = ‘func()’ 执行函数。然后使用 setup = ‘from __main__ import func’ 即可,如果要import 多个需要使用 setup = from __main__ import func; import simplejson'
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
def test1(): n=0 for i in range(101): n+=i return ndef test2(): return sum(range(101))def test3(): return sum(x for x in range(101))if __name__=='__main__': from timeit import Timer t1=Timer("test1()","from __main__ import test1") t2=Timer("test2()","from __main__ import test2") t3=Timer("test3()","from __main__ import test3") print(t1.timeit(10000)) print(t2.timeit(10000)) print(t3.timeit(10000)) print(t1.repeat(3,10000)) print(t2.repeat(3,10000)) print(t3.repeat(3,10000)) t4 = timeit.timeit(stmt=test1,setup="from __main__ import test1",number=10000) t5 = timeit.timeit(stmt=test2,setup="from __main__ import test2",number=10000) t6 = timeit.timeit(stmt=test3,setup="from __main__ import test3",number=10000) print(t4) #0.05130029071325269 print(t5) #0.015494466822610305 print(t6) #0.05650903115721077 print(timeit.repeat(stmt=test1,setup="from __main__ import test1",number=10000)) # [0.05308853391023148, 0.04544335904366706, 0.05969025402337652] print(timeit.repeat(stmt=test2,setup="from __main__ import test2",number=10000)) # [0.012824560678924846, 0.017111019558035345, 0.01429126826003152] print(timeit.repeat(stmt=test3,setup="from __main__ import test3",number=10000)) # [0.07385010910706968, 0.06244617606430164, 0.06273494371932059]#res:0.0439169182005883850.0148923555419325780.05214884436618059[0.04372713709398021, 0.04197132052492908, 0.04255431716177577][0.014356804181737959, 0.012456603785177323, 0.012629659578433372][0.0543709217115389, 0.05334180294099272, 0.05334931226535494] |
python之timeit模块的更多相关文章
- python:timeit模块
(鱼c)timeit模块详解——准确测量小段代码的执行时间 http://bbs.fishc.com/forum.php?mod=viewthread&tid=55593&extra= ...
- Python 使用timeit模块计算时间复杂度时系统报“invalid syntax”错误
最近在看算法相关的文档 在时间复杂度环节 遇到一个实例: 导入timeit模块后,通过Timer定时器计算两种不同处理方法的时间复杂度 错误代码及报错如下图所示: 仔细查阅 发现from__main_ ...
- 如何使用python timeit模块使用实践
其实平时使用测试应用运行时间的情况 细算一下还真的很少.很久没有做性能优化的工作,不管是cProfile还是timeit模块都已经生疏了很久没有使用,我在以前的文章里面有提到过cPfile的性能测试使 ...
- python timeit模块用法
想测试一行代码的运行时间,在python中比较方便,可以直接使用timeit: >>> import timeit #执行命令 >>> t2 = timeit.Ti ...
- python timeit模块
timeit模块timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', timer=<time ...
- python timeit模块简单用法
timeit模块提供了一种简便的方法来为Python中的小块代码进行计时. 模块调用函数,stmp为要测试的函数,setup为测试环境,number为运行次数 timeit.timeit(stmt=) ...
- 2 timeit模块,python中数据结构
1.timeit模块:代码事件测量模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', ti ...
- python中的计时器:timeit模块
python中的计时器:timeit模块 (1) timeit - 通常在一段程序的前后都用上time.time()然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:ti ...
- python中计时模块timeit的使用方法
timeit 模块: timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导 ...
随机推荐
- Python字典推导式将cookie字符串转化为字典
Python中的列表推导式一般是大家所熟悉的,可以极大的简洁代码:而Python中的字典推导式和列表推导式也是大同小异的 cookie: PHPSESSID=et4a33og7nbftv60j3v9m ...
- python 写接口供外部调用
.py: import requests import urllib2 import commands import subprocess def check(): status, msg = com ...
- EJB通过注解方式注入并使用其它EJB或者服务、配置JBoss数据源
版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/Jerome_s/article/details/37103171 通过注解方式注入并使用其他EJB或者服务 ...
- spring boot技术干货
Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目 Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式 Spring Boot2 系列教程(三) ...
- linux复习5
权限----------------- r //100 = 4 //文件 :读取内容, //文件夹:是查看文件夹的内容 w //文件 :写数据到文件 //文件夹:增删文件. //10 = 2 x // ...
- 多Y轴,下拉框渲染,相同类型不同数据
放上json文件: { "2017年3月": { "outKou": "5525.86", "inKou": " ...
- exits 和no exits
exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(select ...
- Delphi 有类型文件
- maven 学习之路一
一.mave介绍: maven :我的理解就是一个代码构建管理的一个工具.类似的工具有gradle,ant等. 官方理解:Apache Maven is a software project mana ...
- 架构师成长之路5.6-Saltstack配置管理(jinja模板)
点击架构师成长之路 架构师成长之路5.6-Saltstack配置管理(jinja模板) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要FU ...