zoukankan      html  css  js  c++  java
  • 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 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]

      

  • 相关阅读:
    java map遍历并删除特定值
    控制反转,依赖注入
    【转】Spring MVC 标签总结
    Spring test
    oracle数据库的冷备份
    ORACLE的数据库知识(摘抄自其他博客园文章)
    禅道工具的下载和使用(原地址:https://www.cnblogs.com/ydnice/p/5800256.html)
    mysql数据库的锁表与解决办法(原博客url:http://www.cnblogs.com/wanghuaijun/p/5949934.html)
    把.exe的格式的运行程序加到电脑本地服务的办法(本文来源于百度)
    Struts2的学习自我总结
  • 原文地址:https://www.cnblogs.com/valorchang/p/11282126.html
Copyright © 2011-2022 走看看