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

时间:2014-09-13 18:52:04

标签: python linux unix python-3.x

我对上述功能的结果的准确性感到非常非常困惑 对我来说,文档根本不清楚,例如这里有两句话:

来自time模块文档

  

各种实时函数的精度可能低于表示其值或参数的单位所建议的精度。的 E.g。在大多数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)?

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

1 个答案:

答案 0 :(得分: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))

在我的Mac上打印:

clock        0.6716716717
time         0.2892525704
perf_counter 0.1550070010

所以perf_counter在我的架构上具有最高的精度,因为它每秒更改一次,使值之间的差值更小。

您可以使用time.get_clock_info() function来查询每种方法提供的精确度:

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