代码之家  ›  专栏  ›  技术社区  ›  Corey Goldberg

python的time.clock()与time.time()精确性?

  •  403
  • Corey Goldberg  · 技术社区  · 16 年前

    在python中,哪个更好地用于计时?time.clock()或time.time()?哪一个更准确?

    例如:

    start = time.clock()
    ... do something
    elapsed = (time.clock() - start)
    

    VS

    start = time.time()
    ... do something
    elapsed = (time.time() - start)
    
    17 回复  |  直到 6 年前
        1
  •  150
  •   haggai_e    9 年前

    截至3.3, time.clock() is deprecated ,建议使用 time.process_time() time.perf_counter() 相反。

    之前在2.7中,根据 time module docs :

    时间,时钟()

    在UNIX上,将当前处理器时间作为浮点数返回 以秒表示。精确性,事实上就是 “处理器时间”的含义取决于c函数的含义 但无论如何, 这是用于 基准测试python或计时算法。

    在Windows上,此函数返回自 第一次调用此函数时,将其作为浮点数,基于 win32函数queryperformancecounter()。分辨率通常是 比一微秒好。

    此外,还有 timeit 用于基准测试代码段的模块。

        2
  •  45
  •   Engineero    6 年前

    简短的回答是:大多数时候 time.clock() 会更好。 但是,如果您正在计时某些硬件(例如,在gpu中放入的某些算法),则 时间,时钟() 会摆脱这次 time.time() 是唯一的解决办法。

    注意:无论使用什么方法,计时都取决于您无法控制的因素(进程何时切换、多久切换一次等等),这在 时间,时间() 但也存在于 时间,时钟() ,因此您不应该只运行一个计时测试,而应该始终运行一系列测试并查看时间的平均值/方差。

        3
  •  25
  •   Engineero    6 年前

    Others 已回复回复: time.time() VS time.clock() .

    但是,如果您正为基准测试/分析目的对代码块的执行进行计时,则应该查看 timeit module .

        4
  •  19
  •   Engineero    6 年前

    要记住一件事: 更改系统时间影响 time.time() 但不是 time.clock() .

    我需要控制一些自动测试的执行。如果测试用例的一个步骤花费的时间超过了给定的时间量,则该tc被中止以继续下一个步骤。

    但有时需要一个步骤来更改系统时间(检查被测应用程序的调度程序模块),因此在未来几个小时设置系统时间后,tc超时过期,测试用例被中止。我不得不从 时间,时间() 时间,时钟() 妥善处理。

        5
  •  18
  •   Engineero    6 年前

    clock() ->浮点数

    返回自进程开始或自 第一次打电话给 时钟() . 这和系统一样精确 记录。

    time() ->浮点数

    返回自纪元以来以秒为单位的当前时间。 如果系统时钟提供它们,可能会出现几秒钟。

    通常 时间() 更精确,因为操作系统存储进程运行时间的精度与存储系统时间(即实际时间)的精度不同

        6
  •  17
  •   user15910    16 年前

    取决于你关心什么。如果您是指墙上的时间(如中所示,墙上时钟上的时间),time.clock()不会提供精确性,因为它可能管理CPU时间。

        7
  •  13
  •   Shiva    11 年前

    为了我自己 practice. time() clock() 在Linux上。 时钟() 只有精度小于10毫秒。 time() 准确无误。 我的测试是在centos 6.4python 2.6上进行的

    using time():
    
    1 requests, response time: 14.1749382019 ms
    2 requests, response time: 8.01301002502 ms
    3 requests, response time: 8.01491737366 ms
    4 requests, response time: 8.41021537781 ms
    5 requests, response time: 8.38804244995 ms
    

    using clock():

    1 requests, response time: 10.0 ms
    2 requests, response time: 0.0 ms 
    3 requests, response time: 0.0 ms
    4 requests, response time: 10.0 ms
    5 requests, response time: 0.0 ms 
    6 requests, response time: 0.0 ms
    7 requests, response time: 0.0 ms 
    8 requests, response time: 0.0 ms
    
        8
  •  6
  •   Justin Sheehy    16 年前

    不同之处在于平台的特殊性。

    例如,windows上的clock()与linux上的非常不同。

    对于您描述的这类示例,您可能需要使用“timeit”模块。

        9
  •  3
  •   auspace    16 年前

    在Unix上,clock()测量当前进程已使用的CPU时间量,因此不适合测量过去某个时间点的运行时间。在windows上,它将测量自第一次调用该函数以来经过的挂钟秒数。在任一系统上,time()将返回自纪元以来经过的秒数。

    如果您编写的代码只适用于Windows,那么这两种方法都可以工作(尽管您将使用两种不同的方法-time.clock()不需要减法)。如果要在unix系统上运行,或者希望代码保证可移植,则需要使用time.time()。

        10
  •  2
  •   Babak    16 年前

    简短回答:使用 时间,时钟() 用于python中的计时。

    在*nix系统上,clock()以浮点数形式返回处理器时间,单位为秒。在Windows上,它返回自第一次调用此函数以来经过的秒数(以浮点数形式)。

    time()返回从纪元开始的秒数(以UTC为单位),作为浮点数。即使time()返回浮点数,也不能保证1秒的精度更好。还要注意,如果系统时钟在两次调用此函数之间被设置为向后,则第二次函数调用将返回一个较低的值。

        11
  •  2
  •   Jake    16 年前

    据我所知,time.clock()的精度是系统允许的。

        12
  •  2
  •   Nurul Akter Towhid    8 年前

    我用这段代码来比较两种方法。我的操作系统是windows 8,处理器核心i5,ram 4gb

    import time
    
    def t_time():
        start=time.time()
        time.sleep(0.1)
        return (time.time()-start)
    
    
    def t_clock():
        start=time.clock()
        time.sleep(0.1)
        return (time.clock()-start)
    
    
    
    
    counter_time=0
    counter_clock=0
    
    for i in range(1,100):
        counter_time += t_time()
    
        for i in range(1,100):
            counter_clock += t_clock()
    
    print "time() =",counter_time/100
    print "clock() =",counter_clock/100
    

    输出:

    时间()=0.0993799996376

    时钟()=0.0993572257367

        13
  •  2
  •   Chris_Rands    6 年前

    正如其他人所指出的那样 time.clock() 赞成 time.perf_counter() time.process_time() ,但Python3.7引入了纳秒级的分辨率计时 time.perf_counter_ns() , time.process_time_ns() time.time_ns() ,以及其他3个功能。

    这6个新的纳秒分辨率函数在 PEP 564 :

    time.clock_gettime_ns(clock_id)

    time.clock_settime_ns(clock_id, time:int)

    time.monotonic_ns()

    时间性能计数器

    时间。处理时间()

    时间,时间

    这些函数类似于没有后缀的版本,但是 以python int的形式返回纳秒数。

    正如其他人也注意到的,使用 timeit module 为函数和小代码段计时。

        14
  •  1
  •   dsgdfg    8 年前

    正确答案: 它们的长度都是相同的。

    但是如果 subject time ?

    一个小测试用例 :

    import timeit
    import time
    
    clock_list = []
    time_list = []
    
    test1 = """
    def test(v=time.clock()):
        s = time.clock() - v
    """
    
    test2 = """
    def test(v=time.time()):
        s = time.time() - v
    """
    def test_it(Range) :
        for i in range(Range) :
            clk = timeit.timeit(test1, number=10000)
            clock_list.append(clk)
            tml = timeit.timeit(test2, number=10000)
            time_list.append(tml)
    
    test_it(100)
    
    print "Clock Min: %f Max: %f Average: %f" %(min(clock_list), max(clock_list), sum(clock_list)/float(len(clock_list)))
    print "Time  Min: %f Max: %f Average: %f" %(min(time_list), max(time_list), sum(time_list)/float(len(time_list)))
    

    我不是在瑞士实验室工作,但我已经测试过…

    基于这个问题: time.clock() time.time()

    编辑: 时间,时钟() 是内部计数器,所以不能在外部使用,受到限制 max 32BIT FLOAT ,如果不存储第一个/最后一个值,则无法继续计数。无法合并另一个计数器…

        15
  •  -1
  •   gustafbstrom    8 年前

    比较ubuntu linux和windows 7的测试结果。

    关于Ubuntu

    >>> start = time.time(); time.sleep(0.5); (time.time() - start)
    0.5005500316619873
    

    在Windows 7上

    >>> start = time.time(); time.sleep(0.5); (time.time() - start)
    0.5
    
        16
  •  -3
  •   ionelberdin Larry LIU    11 年前

    使用时间。首选time()。