Python's time.clock() vs. time.time() accuracy?
在Python中,哪一个更好地用于计时?time.clock()还是time.time()?哪个更准确?
例如:
1 2 3 | start = time.clock() ... do something elapsed = (time.clock() - start) |
VS
1 2 3 | start = time.time() ... do something elapsed = (time.time() - start) |
从3.3开始,time.clock()被弃用,建议使用time.process_time()或time.perf_counter()。
之前在2.7中,根据时间模块文档:
time.clock()
On Unix, return the current processor time as a floating point number
expressed in seconds. The precision, and in fact the very definition
of the meaning of"processor time", depends on that of the C function
of the same name, but in any case, this is the function to use for
benchmarking Python or timing algorithms.On Windows, this function returns wall-clock seconds elapsed since the
first call to this function, as a floating point number, based on the
Win32 function QueryPerformanceCounter(). The resolution is typically
better than one microsecond.
此外,还有用于基准代码段的Timeit模块。
简短的回答是:大多数情况下,
注:无论采用何种方法,计时都将取决于您无法控制的因素(过程切换的时间、频率等),
其他人则回答说:
但是,如果您正在为基准测试/概要分析的目的对代码块的执行进行计时,那么您应该看看
记住一件事:更改系统时间会影响
我需要控制一些自动测试的执行。如果测试用例的一个步骤花费的时间超过了给定的时间,则该TC将被中止以继续下一个步骤。
但有时需要一个步骤来更改系统时间(检查被测应用程序的调度程序模块),因此在未来几个小时内设置系统时间后,tc超时过期,测试用例被中止。我必须从
返回自进程启动以来的CPU时间或实时,或自第一次呼叫
返回当前时间(以秒为单位)。如果系统时钟提供分数秒,则可能存在。
通常,
取决于你关心什么。如果您指的是墙时间(如墙上时钟上的时间),那么time.clock()不提供准确度,因为它可以管理CPU时间。
因为我自己的
1 2 3 4 5 6 7 | 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 |
1 2 3 4 5 6 7 8 | 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 |
不同之处是平台特定的。
例如,Windows上的clock()与Linux上的clock()非常不同。
对于您描述的示例,您可能希望使用"Timeit"模块。
在unix time.clock()中,测量当前进程所使用的CPU时间量,因此从过去的某个时间点测量经过的时间是没有好处的。在Windows上,它将测量自第一次调用函数以来经过的墙时钟秒数。在任何一个系统时间上,time()都将返回从epoch以来经过的秒数。
如果您编写的代码只适用于Windows,那么它们都可以工作(尽管您将使用两种不同的方法——time.clock()不需要进行减法)。如果要在Unix系统上运行,或者需要保证可移植的代码,则需要使用time.time()。
简短的回答:在python中使用time.clock()进行计时。
在*nix系统上,clock()以浮点数形式返回处理器时间,以秒为单位。在Windows上,它以浮点数的形式返回自第一次调用此函数以来经过的秒数。
time()以浮点数形式返回自epoch以来的秒数(以UTC为单位)。不能保证在1秒内获得更好的精度(即使time()返回浮点数)。另外请注意,如果在对该函数的两次调用之间设置了系统时钟,则第二次函数调用将返回一个较低的值。
我用这段代码比较两种方法,我的操作系统是Windows8,处理器核心i5,RAM 4GB
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 | 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
据我所知,time.clock()的精度与您的系统允许的一样高。
正如其他人所指出的,
PEP 564中详细介绍了这6种新的纳秒分辨率函数:
time.clock_gettime_ns(clock_id)
time.clock_settime_ns(clock_id, time:int)
time.monotonic_ns()
time.perf_counter_ns()
time.process_time_ns()
time.time_ns() These functions are similar to the version without the _ns suffix, but
return a number of nanoseconds as a Python int.
正如其他人所指出的,使用
正确答案:它们都是相同长度的分数。
但是如果
一个小测试案例:
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 | 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))) |
我不是在瑞士实验室工作,但我已经测试过了……
基于这个问题:
编辑:
比较UbuntuLinux和Windows7的测试结果。
关于Ubuntu
1 2 | >>> start = time.time(); time.sleep(0.5); (time.time() - start) 0.5005500316619873 |
在Windows 7上
1 2 | >>> start = time.time(); time.sleep(0.5); (time.time() - start) 0.5 |
最好使用time.time()。