Python – time.clock()与time.time() – 精度?

哪个更适合在Python中进行计时? time.clock()或time.time()? 哪一个提供更高的准确性?

例如:

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

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

从3.3开始, time.clock()不推荐使用 ,build议使用time.process_time()time.perf_counter()

以前在2.7,根据时间模块文档

time.clock()

在Unix上,将当前处理器时间作为以秒为单位的浮点数返回。 精确性,实际上“处理器时间”的含义的定义依赖于同名的C函数的定义,但无论如何, 这是用于对Python或时序algorithm进行基准testing的函数。

在Windows上,基于Win32函数QueryPerformanceCounter(),此函数返回从第一次调用此函数以来的挂钟时间(作为浮点数)。 分辨率通常比一微秒更好。

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

简短的回答是:大部分时间time.clock()会更好。 但是,如果你计算一些硬件的时间(例如你放入GPU中的一些algorithm),那么time.clock()将会消除这个时间和time.time()是唯一的解决scheme。

注意:无论使用什么方法,时间将取决于你无法控制的因素(什么时候将进程切换,多久…),这是随着time.time()更糟糕的,但也存在time.clock(),所以你不应该只运行一个时间testing,而是总是进行一系列的testing,看看时间的平均值/方差。

其他人已经回答了:time.time()与time.clock()。

但是,如果您计划执行用于基准testing/分析目的的代码块,则应该查看timeit模块 。

取决于你在乎的是什么。 如果你的意思是WALL TIME(如墙上时钟的时间),time.clock()不提供准确性,因为它可以pipe理CPU时间。

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

我需要控制一些自动testing执行。 如果testing案例的一个步骤超过了一定的时间,则该TC被中止继续下一个。

但是有时需要一个步骤来改变系统时间(以检查被testing的应用程序的调度器模块),因此在将系统时间设置为将来几个小时之后,TC超时过期并且testing案例被中止。 我不得不从time.time()切换到time.clock()来正确处理这个问题。

 clock() -> floating point number Return the CPU time or real time since the start of the process or since the first call to clock(). This has as much precision as the system records. time() -> floating point number Return the current time in seconds since the Epoch. Fractions of a second may be present if the system clock provides them. 

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

为我自己的practice. time() practice. time()比Linux上的clock() practice. time()有更好的精度。 clock()只有精度小于10毫秒。 而time()给出了完美的精度。 我的testing是在CentOS 6.4,Python 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 

差异是非常平台特定的。

例如,clock()在Windows上比在Linux上完全不同。

对于你描述的那些例子,你可能需要“timeit”模块。

在Unix上,time.clock()测量当前进程使用的CPU时间量,因此从过去某个时间点开始测量已用时间并不合适。 在Windows上,它会测量从第一次调用该函数以来的挂钟时间。 在任一系统上,time.time()将返回从历元开始的秒数。

如果你编写的代码仅适用于Windows,那么两者都可以工作(尽pipe你将使用两个不同的方法 – time.clock()不需要减法)。 如果这要在Unix系统上运行,或者你想要保证可移植的代码,你将需要使用time.time()。

简短的回答:在Python中使用time.clock()进行计时。

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

time()以UTC的forms返回自纪元以来的秒数,作为浮点数。 不能保证你会得到更好的精度1秒(即使time()返回一个浮点数)。 还要注意的是,如果系统时钟已经在两次对该函数的调用之间回退,则第二次函数调用将返回一个较低的值。

据我所知,time.clock()与系统允许的一样精确。

我使用这个代码来比较2种方法。我的操作系统是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

正确的答案: 他们都是相同的长度的一小部分。

但如果subjecttime ,哪个更快?

一个小testing用例

 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))) 

我不是瑞士实验室的工作人员,但我已经testing过..

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

编辑: time.clock()是内部计数器,因此不能在外部使用,限制max 32BIT FLOAT ,如果不存储第一个/最后一个值,则不能继续计数。 不能合并另一个计数器…

比较Ubuntu Linux和Windows 7的testing结果。

在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 

要扩展@ Hill的结果,下面是一个在Xubuntu 14.04上通过wine使用python 2.7.6的testing:
(timeit.default_timer将使用time.clock(),因为它将操作系统视为“win32”)

 >>> from time import sleep, time, clock >>> start = clock(); sleep(0.5); (clock() - start) # result is never the same: 0.5009140000000087 >>> start = time(); sleep(0.5); (time() - start) # pretty solid result: 0.500999927520752 >>> 

请注意,我的笔记本电脑速度很慢,目前我正在托pipe3台服务器,同时运行5个耗资源丰富的带有扩展名的铬标签。
所以是的,我有很多开销使得这看起来比它应该花费更多的时间。

使用time.time()是首选。