Python2/3中的time.clock()和time.time()分辨率

zer*_*uno 2 python unix linux python-3.x

我对上述函数结果的精确度非常非常困惑.
对我来说文档根本不清楚,例如这里有两句话:

来自time模块文档

各种实时函数的精度可能低于表示其值或参数的单位所建议的精度.例如,在大多数Unix系统上,时钟"滴答"仅为每秒50或100次.

来自timeit模块文档

以特定于平台的方式定义默认计时器.在Windows上,time.clock()具有微秒粒度,但time.time()的粒度是1/60秒.在Unix上,time.clock()具有1/100秒的粒度,而time.time()则更加精确.在任一平台上,default_timer()都会测量挂钟时间,而不是CPU时间.这意味着在同一台计算机上运行的其他进程可能会干扰计时.

现在,因为实时,在Unix中,它返回time.time()并且它的分辨率远远优于1/100,它如何只能"滴答"每秒50或100次?


总是关于解决方案,我无法理解我调用每个函数的确切分辨率,所以我尝试了以下内容并在评论中进行了猜测:

>>> time.clock()
0.038955                            # a resolution of microsecond?
>>> time.time()                     
1410633457.0955694                  # a resolution of 10-7 second?
>>> time.perf_counter()
4548.103329075                      # a resolution of 10-9 second (i.e nanosecond)?
Run Code Online (Sandbox Code Playgroud)

PS这是在Python3.4.0上尝试的,在Python2中time.clock(),time.time()我总是在点后得到6个数字,所以1us精度?

Mar*_*ers 5

精确度与价值变化的频率有关.

如果您可以无限快速地调用这些函数中的任何一个,则每个函数都将以不同的速率返回一个新值.

因为每个都返回一个没有绝对精度的浮点值,所以你不能从它们的返回值中告诉它们具有什么精度.您需要测量值随时间变化的方式,以了解它们的精度.

要显示差异,请运行:

import time

def average_deltas(*t):
    deltas = [t2 - t1 for t1, t2 in zip(t, t[1:])]
    return sum(deltas) / len(deltas)

for timer in time.clock, time.time, time.perf_counter:
    average = average_deltas(*(timer() for _ in range(1000))) * 10 ** 6
    print('{:<12} {:.10f}'.format(timer.__name__, average))
Run Code Online (Sandbox Code Playgroud)

在我的Mac上打印:

clock        0.6716716717
time         0.2892525704
perf_counter 0.1550070010
Run Code Online (Sandbox Code Playgroud)

因此perf_counter,我的架构具有最高的精度,因为它每秒更频繁地更改,使值之间的增量更小.

您可以使用该time.get_clock_info()函数来查询每个方法提供的精度:

>>> for timer in time.clock, time.time, time.perf_counter:
...     name = timer.__name__
...     print('{:<12} {:.10f}'.format(name, time.get_clock_info(name).resolution))
... 
clock        0.0000010000
time         0.0000010000
perf_counter 0.0000000010
Run Code Online (Sandbox Code Playgroud)