Python的time.clock()和time.time()哪个更准确?

455

在Python中,哪种方法更好用于时间计算?time.clock()还是time.time()?哪一种提供更高的精度?

例如:

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

对比。

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

43
请注意,从Python 3.3开始,使用time.clock()已经弃用,建议使用perf_counter()process_time()代替。 - Cody Piersall
3
即使在Python 2上,你也应该使用timeit.default_timer()来测量性能(它根据操作系统分配给time.time()time.clock())。 - jfs
请参考此评论,了解time.clocktime.process_time如何将进程使用的所有核心相加,但不包括子进程。另请参考这篇关于精度的讨论(当然,这取决于系统)。 - max
16个回答

180
截至3.3版本,time.clock()已被弃用,建议使用time.process_time()time.perf_counter()代替。
之前在2.7版本中,根据时间模块文档

time.clock()

在Unix系统中,返回当前处理器时间,以秒为单位表示的浮点数。精度实际上取决于与同名C函数的定义有关“处理器时间”的含义,但不管怎样,这是用于Python基准测试或定时算法的函数。

在Windows系统中,该函数返回自第一次调用该函数以来经过的秒数,作为浮点数,基于Win32函数QueryPerformanceCounter()。 分辨率通常优于一微秒。

此外,还有timeit 模块可用于对代码片段进行基准测试。

4
这是用于基准测试Python或计时算法的功能。Python文档根据这里给出的答案似乎不太准确。time.clock()并不总是适合于基准测试,特别是由于存在timeit模块。 - Corey Goldberg
1
@Corey Goldberg:你是否提交了文档错误?(他们的意思是“使用*clock()而不是time()*”,但是没错) - smci
4
可以在这里阅读到,time.clock() 的行为似乎取决于平台,而 time.process_time() 则不是。这就是为什么 time.clock() 被弃用的原因。 - Jim Aho
time.process_time 不包括在睡眠中花费的时间,这可能是尝试计时多线程代码或等待 I/O 的代码时出现问题的原因。唯一没有这个问题的计时器是 time.time,但它速度较慢。难道没有其他包括睡眠时间的替代方法吗? - mxmlnkn

50
简而言之,大多数情况下使用time.clock()会更好。 然而,如果你要计时一些硬件(例如你放在GPU中的某些算法),那么time.clock()将无法计时这部分时间,此时只有time.time()是唯一可选的方法。
注意:无论使用哪种方法,计时都会受到你无法控制的因素的影响(例如进程何时切换、频率如何等等)。尽管使用time.clock()的情况并不如time.time()严重,但你永远不应该只运行一个计时测试,而应该始终运行一系列测试,并查看时间的平均值/方差。

1
同时,通过异步方式请求网络资源时(进程将被阻塞以等待),网络等待时间也将被消除。 - dasons

25

其他人已经回答了time.time()time.clock()的问题。

然而,如果您正在为基准测试/分析目的计时一个代码块的执行时间,请看一下timeit模块


20
在Python中,timeit.default_timer会根据操作系统的不同被赋值为time.time()或者time.clock()。在Python 3.3及以上版本中,default_timer在任何平台上都是time.perf_counter()。请注意,这里只是涉及到Python中计时器函数的内容。 - jfs

21

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

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

但是有时需要更改系统时间(以检查待测试应用程序的调度程序模块),因此在将系统时间设置为未来几个小时后,测试用例超时并被中止。我不得不从time.time()切换到time.clock()以正确处理这个问题。


1
我正需要这个。谢谢 :) 即使用户更改操作系统的时间,它也会对我有所帮助。 - Aashiq Hussain
我该如何比较这个时间和用户存储的小时:分钟格式的时间? - Aashiq Hussain

20

clock() -> 浮点数

返回自进程启动或首次调用clock()以来的CPU时间或真实时间。这具有系统记录的精度。

time() -> 浮点数

返回自纪元以来的当前时间(秒)。如果系统时钟提供了小数部分,则可能存在。

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


17

这取决于你关心什么。如果你指的是墙上的时间(即,墙上钟表上的时间),那么 time.clock()提供的准确性很低,因为它可能管理 CPU 时间。


1
确切地说,我在 Linux 服务器上只是使用了 time.clock(),但我得到的数字绝对不是秒数。 - Roman Plášil

15

time()在Linux上比clock()具有更好的精度。clock()的精度只有不到10毫秒,而time()则具有完美的精度。我的测试是在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

使用 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

那我假设在 Wine 上使用 time() 函数? - Tcll

10
正如其他人所指出的一样,time.clock()已经被弃用,现在推荐使用time.perf_counter()time.process_time(),但Python 3.7引入了具有纳秒分辨率的计时功能:time.perf_counter_ns()time.process_time_ns()time.time_ns(),以及其他三个函数。

这6个新的纳秒分辨率函数在PEP 564中详细介绍:

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

这些函数与没有 _ns 后缀的版本类似,但返回一个Python int类型的纳秒数。

正如其他人所指出的一样,使用timeit模块来计时函数和小代码片段。


6

这个差异非常依赖于平台。

例如,clock()在Windows和Linux上有很大的区别。

对于你描述的示例,你可能想使用“timeit”模块。


3
请问"Clock"在哪些方面是“非常不同”的? - n611x007

5

我使用这段代码来比较两种方法。我的操作系统是Windows 8,处理器是Core i5,内存为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

输出:

time() = 0.0993799996376

clock() = 0.0993572257367

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接