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 timeit
foooo = """
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 timeit
 
foooo = """
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-8
import timeit
 
# 初始化类
= """
say_hi.ParseFromString(p)
"""
 
= """
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 in range(101):
        n+=i
    return n
def test2():
    return sum(range(101))
def test3():
    return sum(x for 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.043916918200588385
0.014892355541932578
0.05214884436618059
[0.043727137093980210.041971320524929080.04255431716177577]
[0.0143568041817379590.0124566037851773230.012629659578433372]
[0.05437092171153890.053341802940992720.05334931226535494]

  

python之timeit模块的更多相关文章

  1. python:timeit模块

    (鱼c)timeit模块详解——准确测量小段代码的执行时间 http://bbs.fishc.com/forum.php?mod=viewthread&tid=55593&extra= ...

  2. Python 使用timeit模块计算时间复杂度时系统报“invalid syntax”错误

    最近在看算法相关的文档 在时间复杂度环节 遇到一个实例: 导入timeit模块后,通过Timer定时器计算两种不同处理方法的时间复杂度 错误代码及报错如下图所示: 仔细查阅 发现from__main_ ...

  3. 如何使用python timeit模块使用实践

    其实平时使用测试应用运行时间的情况 细算一下还真的很少.很久没有做性能优化的工作,不管是cProfile还是timeit模块都已经生疏了很久没有使用,我在以前的文章里面有提到过cPfile的性能测试使 ...

  4. python timeit模块用法

    想测试一行代码的运行时间,在python中比较方便,可以直接使用timeit: >>> import timeit #执行命令 >>> t2 = timeit.Ti ...

  5. python timeit模块

    timeit模块timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', timer=<time ...

  6. python timeit模块简单用法

    timeit模块提供了一种简便的方法来为Python中的小块代码进行计时. 模块调用函数,stmp为要测试的函数,setup为测试环境,number为运行次数 timeit.timeit(stmt=) ...

  7. 2 timeit模块,python中数据结构

    1.timeit模块:代码事件测量模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', ti ...

  8. python中的计时器:timeit模块

    python中的计时器:timeit模块 (1) timeit - 通常在一段程序的前后都用上time.time()然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:ti ...

  9. python中计时模块timeit的使用方法

    timeit 模块: timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导 ...

随机推荐

  1. Luogu P4436 [HNOI/AHOI2018]游戏

    题目 我们要求出\(l_i,r_i\)表示\(i\)最远能够到达的最左边和最右边的格子. 首先有一个比较简单的暴力,就是每次我们选择一个格子,然后从当前格子开始往左右暴力扩展,找到能够到达的最远的格子 ...

  2. Neo4j/Cypher: All paths between two nodes with a relationship property filter

    解决方案一 I am trying to perform a query to retrieve all paths between two nodes a and b in which all th ...

  3. WPF中Brush类型

    画刷Brush使用 画刷类 SolidColorBrush LinearGradientBrush RadialGradientBrush ImageBrush VisualBrush Drawing ...

  4. C# 面向对象5 this关键字和析构函数

    this关键字 1.代表当前类的对象 2.在类当中显示的调用本类的构造函数(避免代码的冗余) 语法: ":this" 以下一个参数的构造函数调用了参数最全的构造函数!并赋值了那些不 ...

  5. C# 面向对象1(类和对象的概念)

    1.面向过程-->面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 2.面向过程的思想: 以上的,需求一更改,会导致不同的方法,一一去更改. 3.面向对象的思想:找个 ...

  6. 提升scrapy的爬取效率

    增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. 降低日志级别 ...

  7. 11 Mysql之配置双主热备+keeepalived.md

    准备 1. 双主 master1 192.168.199.49 master2 192.168.199.50 VIP 192.168.199.52 //虚拟IP 2.环境 master:nginx + ...

  8. Vue之动态class写法总结

    对象方法 最简单的绑定 :class="{ 'active': isActive }" 判断是否绑定一个active :class="{'active':isActive ...

  9. 第十四篇 JS实现加减乘除 正则表达式

    JS实现加减乘除 这节课,将会继续使用到if判断,会让同学们再看到一个新的,else if判断语句,意思是:否则如果,是基于if下的判断语句,就是说,if不成立则再来判断else if,可以这样,假如 ...

  10. js带有遮罩的弹窗

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...