在 Python 中哪个更适合用于计时? time.clock() 还是 time.time()?哪一个提供更高的准确性?
例如:
start = time.clock()
... do something
elapsed = (time.clock() - start)
对比
start = time.time()
... do something
elapsed = (time.time() - start)
timeit.default_timer()
to measure performance (it is assigned to time.time() or time.clock() depending on OS)。
time.clock
和 time.process_time
中求和,但子进程不是。另请参阅 this discussion of precision(当然,因系统而异)。
从 3.3 开始,time.clock() is deprecated,建议改用 time.process_time() 或 time.perf_counter()。
根据 time module docs,之前在 2.7 中:
time.clock() 在 Unix 上,以浮点数形式返回当前处理器时间,以秒为单位。精度,实际上是“处理器时间”含义的定义,取决于同名 C 函数的精度,但无论如何,这是用于对 Python 或计时算法进行基准测试的函数。在 Windows 上,此函数根据 Win32 函数 QueryPerformanceCounter() 以浮点数形式返回自第一次调用此函数以来经过的挂钟秒数。分辨率通常优于一微秒。
此外,还有用于对代码段进行基准测试的 timeit 模块。
简短的回答是:大多数时候time.clock()
会更好。但是,如果您正在为某些硬件计时(例如,您在 GPU 中放置的某些算法),那么 time.clock()
将摆脱这个时间,而 time.time()
是唯一剩下的解决方案。
注意:无论使用哪种方法,时间都将取决于您无法控制的因素(进程何时切换,多久切换一次,...),这在 time.time()
中更糟,但在 time.clock()
中也存在,所以你不应该仅运行一次计时测试,但始终运行一系列测试并查看时间的均值/方差。
Others 已回答:time.time()
与 time.clock()
。
但是,如果您要为执行基准测试/分析目的而定时执行代码块,则应该查看 timeit
module。
timeit.default_timer
分配给 time.time()
或 time.clock()
。在 Python 3.3+ 上,default_timer
在所有平台上都是 time.perf_counter()
。
要记住的一件事:更改系统时间会影响 time.time()
而不是 time.clock()
。
我需要控制一些自动测试执行。如果测试用例的一个步骤花费的时间超过给定的时间,则该 TC 将被中止以继续下一个步骤。
但有时需要一个步骤来改变系统时间(检查被测应用的调度器模块),所以在将系统时间设置为未来几个小时后,TC超时到期,测试用例中止。我必须从 time.time()
切换到 time.clock()
才能正确处理这个问题。
clock()
->浮点数
返回自进程开始或自第一次调用 clock()
以来的 CPU 时间或实时时间。这与系统记录的精度一样高。
time()
->浮点数
返回自 Epoch 以来的当前时间(以秒为单位)。如果系统时钟提供它们,则可能存在几分之一秒。
通常time()
更精确,因为操作系统不会以它们存储系统时间(即实际时间)的精度存储进程运行时间
取决于你关心什么。如果您指的是 WALL TIME(如墙上时钟上的时间), time.clock() 不会提供任何准确性,因为它可能会管理 CPU 时间。
time.clock()
,我得到的数字肯定不是秒
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
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
正如其他人所指出的那样,不推荐使用 time.clock()
以支持 time.perf_counter()
或 time.process_time()
,但 Python 3.7 引入了具有 time.perf_counter_ns()
、time.process_time_ns()
和 time.time_ns()
的纳秒分辨率计时,以及 3 个其他函数。
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() 这些函数和没有_ns后缀的版本类似,但是返回Python int 的纳秒数。
正如其他人也指出的那样,使用 timeit
module 对函数和小代码片段进行计时。
差异是非常特定于平台的。
例如,clock() 在 Windows 上与在 Linux 上非常不同。
对于您描述的那种示例,您可能需要“timeit”模块。
clock
是 "very different"
的哪些方面?
我使用此代码比较 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
输出:
time() = 0.0993799996376
clock() = 0.0993572257367
在 Unix 上 time.clock() 测量当前进程已使用的 CPU 时间量,因此它不适用于测量过去某个时间点的经过时间。在 Windows 上,它将测量自第一次调用该函数以来经过的挂钟秒数。在任一系统上 time.time() 将返回自纪元以来经过的秒数。
如果您正在编写仅适用于 Windows 的代码,那么任何一个都可以工作(尽管您会以不同的方式使用这两者 - time.clock() 不需要减法)。如果这要在 Unix 系统上运行,或者您想要保证可移植的代码,您将需要使用 time.time()。
time.clock()
在 Python 3.8 中被删除,因为它有 platform-dependent behavior:
在 Unix 上,以浮点数形式返回当前处理器时间,以秒为单位。
在 Windows 上,此函数返回自第一次调用此函数以来经过的挂钟秒数,作为浮点数 print(time.clock()); time.sleep(10); print(time.clock()) # Linux : 0.0382 0.0384 # 查看处理器时间 # Windows: 26.1224 36.1566 # 查看挂钟时间
那么选择哪个功能呢?
处理器时间:这是该特定进程在 CPU 上主动执行所花费的时间。睡眠、等待 Web 请求或仅执行其他进程的时间不会对此产生影响。使用 time.process_time()
使用 time.process_time()
挂钟时间:这是指“挂在墙上的时钟”已经过去了多少时间,即在实时之外。使用 time.perf_counter() time.time() 还可以测量挂钟时间,但可以重置,因此您可以及时返回 time.monotonic() 无法重置(单调 = 仅向前)但精度低于时间.perf_counter()
使用 time.perf_counter() time.time() 还可以测量挂钟时间,但可以重置,因此您可以及时返回 time.monotonic() 无法重置(单调 = 仅向前)但精度低于时间.perf_counter()
time.time() 也测量挂钟时间,但可以重置,所以你可以回到过去
time.monotonic() 无法重置(单调 = 仅向前)但精度低于 time.perf_counter()
简短的回答:在 Python 中使用 time.clock() 进行计时。
在 *nix 系统上,clock() 以浮点数的形式返回处理器时间,以秒为单位。在 Windows 上,它返回自第一次调用此函数以来经过的秒数,作为浮点数。
time() 以浮点数形式返回纪元以来的秒数,以 UTC 表示。无法保证您将获得比 1 秒更好的精度(即使 time() 返回一个浮点数)。另请注意,如果系统时钟在两次调用此函数之间已调回,则第二次函数调用将返回较低的值。
据我所知, time.clock() 的精度与您的系统允许的一样高。
正确答案:它们都是相同长度的分数。
但是如果 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()
编辑:time.clock()
是内部计数器,因此不能在外部使用,有限制 max 32BIT FLOAT
,如果不存储第一个/最后一个值,则无法继续计数。无法合并另一个计数器...
比较 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
根据此处给出的答案,Python 文档似乎并不准确。 time.clock() 并不总是您想要的基准测试。尤其是存在 timeit 模块
time.clock()
的行为似乎依赖于平台,而time.process_time()
则不然。这就是不推荐使用time.clock()
的原因。time.process_time
不包括睡眠时间,根据我的经验,这在尝试对多线程代码或等待 I/O 的代码进行计时可能是个问题。唯一没有这个问题的计时器是time.time
,但它更慢。难道没有其他选择包括睡眠时间吗?