每次按下按键时,我都会得到一个时间戳:
init_timestamp = time.time()
while (True):
c = getch()
offset = time.time() - init_timestamp
print("%s,%s" % (c,offset), file=f)
我正在验证实际输入密钥的录音时间戳。在将第一个时间戳与波形对齐之后,随后的时间戳略微漂移但一致。我的意思是保存的时间戳晚于按键波形,随着时间的推移越来越晚。
我有理由相信波形时序是正确的(即录音不是快或慢),因为在录音中我还包括一个非常准确的时钟滴答,与第二个标记完美对齐。
我知道time.time()
的准确性存在不可避免的限制,但这似乎并不能解释我所看到的情况 - 如果双方都同样错,那是可以接受的,但我不要让它越来越偏离真相。
为什么我会看到这种漂移行为,我该怎么做才能避免它?
答案 0 :(得分:1)
使用time.monotonic()
代替time.time()
解决了这个问题。 time.time()
似乎使用了gettimeofday
(at 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)
...