在Python中,哪种方法更好用于时间计算?time.clock()还是time.time()?哪一种提供更高的精度?
例如:
start = time.clock()
... do something
elapsed = (time.clock() - start)
对比。
start = time.time()
... do something
elapsed = (time.time() - start)
time.clock()
在Unix系统中,返回当前处理器时间,以秒为单位表示的浮点数。精度实际上取决于与同名C函数的定义有关“处理器时间”的含义,但不管怎样,这是用于Python基准测试或定时算法的函数。
在Windows系统中,该函数返回自第一次调用该函数以来经过的秒数,作为浮点数,基于Win32函数QueryPerformanceCounter()。 分辨率通常优于一微秒。
此外,还有timeit 模块可用于对代码片段进行基准测试。time.clock()
的行为似乎取决于平台,而 time.process_time()
则不是。这就是为什么 time.clock()
被弃用的原因。 - Jim Ahotime.process_time
不包括在睡眠中花费的时间,这可能是尝试计时多线程代码或等待 I/O 的代码时出现问题的原因。唯一没有这个问题的计时器是 time.time
,但它速度较慢。难道没有其他包括睡眠时间的替代方法吗? - mxmlnkntime.clock()
会更好。
然而,如果你要计时一些硬件(例如你放在GPU中的某些算法),那么time.clock()
将无法计时这部分时间,此时只有time.time()
是唯一可选的方法。time.clock()
的情况并不如time.time()
严重,但你永远不应该只运行一个计时测试,而应该始终运行一系列测试,并查看时间的平均值/方差。需要记住的一件事:
更改系统时间会影响time.time()
,但不会影响time.clock()
。
我需要控制一些自动化测试执行。如果测试用例的一个步骤花费的时间超过了给定的时间,那么该测试用例将被中止以继续进行下一个测试用例。
time.time()
切换到time.clock()
以正确处理这个问题。clock()
-> 浮点数
返回自进程启动或首次调用clock()
以来的CPU时间或真实时间。这具有系统记录的精度。
time()
-> 浮点数
返回自纪元以来的当前时间(秒)。如果系统时钟提供了小数部分,则可能存在。
通常time()
更精确,因为操作系统不会像存储系统时间(即实际时间)一样以高精度存储进程运行时间。
这取决于你关心什么。如果你指的是墙上的时间(即,墙上钟表上的时间),那么 time.clock()提供的准确性很低,因为它可能管理 CPU 时间。
time.clock()
,但我得到的数字绝对不是秒数。 - Roman Plášiltime()
在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
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
模块来计时函数和小代码片段。
这个差异非常依赖于平台。
例如,clock()在Windows和Linux上有很大的区别。
对于你描述的示例,你可能想使用“timeit”模块。
我使用这段代码来比较两种方法。我的操作系统是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
time.clock()
已经弃用,建议使用perf_counter()
或process_time()
代替。 - Cody Piersalltimeit.default_timer()
来测量性能(它根据操作系统分配给time.time()
或time.clock()
)。 - jfstime.clock
和time.process_time
如何将进程使用的所有核心相加,但不包括子进程。另请参考这篇关于精度的讨论(当然,这取决于系统)。 - max