zoukankan      html  css  js  c++  java
  • 【Python】测算代码运行时间

    整理自这里这里

    timeit模块

    • timeit模块定义了接受两个参数的 Timer 类。两个参数都是字符串。 第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境,手工地执行建立语句,然后手工地编译和执行被计时语句。

    • 一旦有了 Timer 对象,最简单的事就是调用 timeit(),它接受一个参数为每个测试中调用被计时语句的次数,默认为一百万次;返回所耗费的秒数。

    • Timer 对象的另一个主要方法是 repeat(), 它接受两个可选参数。 第一个参数是重复整个测试的次数,第二个参数是每个测试中调用被计时语句的次数。 两个参数都是可选的,它们的默认值分别是 3 和 1000000。 repeat() 方法返回以秒记录的每个测试循环的耗时列表。Python 有一个方便的 min 函数可以把输入的列表返回成最小值,如: min(t.repeat(3, 1000000))

    • 可以在命令行使用 timeit 模块来测试一个已存在的 Python 程序,而不需要修改代码。

    举个例子:

    # -*- coding: utf-8 -*-
    #!/bin/env python
    
    def test1():
        n=0
        for i in range(101):
            n+=i
        return n
    
    def 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(1000000)
        print t2.timeit(1000000)
        print t3.timeit(1000000)
        print t1.repeat(3,1000000)
        print t2.repeat(3,1000000)
        print t3.repeat(3,1000000)
    

    执行结果:

    $ python timetest.py 
    7.99498915672
    3.13702893257
    10.6419789791[8.2126381397247314, 8.6312708854675293, 8.6079621315002441][3.3426268100738525, 3.3914170265197754, 3.5281510353088379][11.097387075424194, 10.941920042037964, 10.874698877334595]
    

    我们可以简单的使用Python提供的魔术函数 %timeit,方便的统计
    函数或语句的执行时间。

    举个例子:

     %timeit [x for x in strings if x.startswith('foo')]
    

    此部分计算的是精确时间,当然对应的就有不精确时间的计算,如下,一般不推荐使用。

    time模块###

    此部分比较好理解,无非就是程序开始前获取一个时间,然后执行完成后再获取一个时间,然后作差即可得到程序执行的时间。上面也提到了,此方法得到的时间并不精确,并不推荐使用。

    time.localtime(), time.time(), time.clock() 对比:

    • time.localtime()localtime返回的是struct_time,包含年月日,显然没有必要,更重要的是localtime()的精度依赖于time()

    • time.time()time返回的是UTC时间(seconds since the 00:00:00 UTC on January 1)。在很多系统,包括windows下精度很差,win32下的精度只有1/18.2秒。不过在Unix/Linux系统下,time()的精度还是很高的

    • Python的标准库手册推荐在任何系统下都尽量使用 time.clock()。不过要注意是在win32系统下,这个函数返回的是真实时间(wall time),而在Unix/Linux下返回的是CPU时间。在win32下,这个函数的时间分辨率好于1微秒。

    对应上面的内容,该部分也有一个魔术函数%time 一次执行一条语句,然后报告总体执行时间。

    例子如下:

    strings = ['foo', 'foobar', 'baz', 'qux', 'python', 'Guido Van Rossum'] * 100000
    %time method = [x for x in strings if x.startswith('foo')]
    

    注意:上述代码中的method=语句赋值不能省略,省略后即生成结果而不计算运行时间

    上述代码在windows平台 Python2.7.11 的环境下测试。

  • 相关阅读:
    jquery插件treetable使用
    WPF界面按钮美化
    Nginx配置
    Spring Framework之AOP
    IOS抓取与反抓取
    Spring Framework之事务管理
    68- 二叉树的最近公共祖先
    Spring Framework之IoC容器
    应试教育引发的思考
    春季实习生校园招聘总结
  • 原文地址:https://www.cnblogs.com/nju2014/p/5510222.html
Copyright © 2011-2022 走看看