time.time()在重复呼叫中漂移

时间:2015-08-19 12:00:55

标签: python macos time signal-processing clock

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

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()的准确性存在不可避免的限制,但这似乎并不能解释我所看到的情况 - 如果双方都同样错,那是可以接受的,但我不要让它越来越偏离真相。

为什么我会看到这种漂移行为,我该怎么做才能避免它?

2 个答案:

答案 0 :(得分:1)

使用time.monotonic()代替time.time()解决了这个问题。 time.time()似乎使用了gettimeofdayat least here it does),由于NTP同步问题,这对于衡量壁时差异显然非常糟糕:

  

gettimeofday()和time()只应用于获取当前时间,如果当前的挂钟时间实际上是你想要的。永远不应该用它们来衡量时间或安排X事件到未来的时间。

     

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

link)。因此,基本上衡量time.time()次呼叫之间的差异是一个坏主意。

答案 1 :(得分:0)

根据您使用的操作系统,您需要使用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)
    ...