【问题标题】:time.time() drift over repeated callstime.time() 在重复调用中漂移
【发布时间】:2015-11-12 17:17:18
【问题描述】:

每次按下这样的键时,我都会得到一个时间戳:

init_timestamp = time.time()
while (True):
    c = getch()
    offset = time.time() - init_timestamp
    print("%s,%s" % (c,offset), file=f)

(getch from this answer).

我正在根据我实际键入按键的录音来验证时间戳。在将第一个时间戳与波形对齐后,后续时间戳略有漂移但始终如一。我的意思是保存的时间戳比按键波形晚,并且随着时间的推移越来越晚。

我有理由确定波形时序是正确的(即记录不快也不慢),因为在记录中我还包括了一个非常准确的时钟的滴答声,它与第二个标记完美对齐。

我知道time.time() 的准确性存在不可避免的限制,但这似乎不能解释我所看到的 - 如果双方都同样错误,那是可以接受的,但我不希望它逐渐偏离真相。

为什么我会看到这种飘忽不定的行为,我可以做些什么来避免它?

【问题讨论】:

  • 你试过time.clock(),在某些系统上,这比time.time()更准确
  • @muddyfish 不,time.clock() 在这里使用肯定是错误的。 time.clock() 是处理器时钟时间(如果程序不使用任何时钟周期,它将不会提前),而不是挂钟时间 (time.time())。另见:pymotw.com/2/time
  • 啊,更正:在 Windows 上 time.clock() 实际上似乎正在返回挂钟秒数。 叹息

标签: python macos time signal-processing clock


【解决方案1】:

根据您使用的操作系统,您需要使用time.time()time.clock()

对于 Windows 操作系统,您将需要使用 time.clock 这给您将秒数作为浮点数。 time.time() 在 windows 上如果我没记错的话time.time() 只在 16 毫秒内准确。

对于 posix 系统(linux、osx),您应该使用 time.time() 这是一个浮点数,它返回自纪元以来的秒数。

在您的代码中添加以下内容,以使您的应用程序更具跨系统兼容性。

import os
if os.name == 'posix':
    from time import time as get_time
else:
    from time import clock as get_time

# now use get_time() to return the timestamp
init_timestamp = get_time()
while (True):
    c = getch()
    offset = get_time() - init_timestamp
    print("%s,%s" % (c,offset), file=f)
    ...

【讨论】:

  • 你可能想要timeit.default_timer()
【解决方案2】:

刚刚通过使用time.monotonic() 而不是time.time() 解决了这个问题。 time.time() 似乎使用了 gettimeofday (at least here it does),由于 NTP 同步问题,这显然不适合测量 walltime 差异:

gettimeofday() 和 time() 应该只用于获取当前时间,前提是当前挂钟时间实际上是您想要的。它们绝不应该用于测量时间或将事件安排到未来 X 时间。

您通常不会在手表上运行 NTP,因此它可能不会在随机方向上跳跃一两秒(或 15 分钟),因为此时它恰好与正确的时钟同步。好的 NTP 实现尽量不让时间像这样跳跃。 他们反而让时钟走得更快或更慢,以便它会漂移到正确的时间。但是,当它在漂移时,您的时钟要么走得太快,要么走得太慢。它没有正确测量时间的流逝。

(link)。所以基本上测量time.time() 调用之间的差异是一个坏主意。

【讨论】:

  • 当前cpython可能使用clock_gettime(2), GetSystemTimeAsFileTime()。您是否检查过time.time() 漂移而time.monotonic() 在您的情况下是否足够准确?你的操作系统,python 版本是什么?
  • OSX,python 3.4.1。我对time.monotonic 没有任何明显的漂移,time.time 肯定在漂移。
猜你喜欢
  • 2019-06-30
  • 1970-01-01
  • 2014-01-22
  • 2019-12-01
  • 2011-09-09
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多