2015-08-19 97 views
2

每一個鍵被按下這樣的時候,我得到一個時間戳:了time.time()漂移千呼萬喚

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()的準確性存在不可避免的限制,但這似乎並不能說明我所看到的情況 - 如果雙方同樣錯誤,那麼可以接受,但我不想要它逐漸越來越脫離事實。

爲什麼我會看到這個漂流行爲,我能做些什麼來避免呢?

+0

您是否嘗試過'time.clock()',在某些系統上,這比時間更準確。time()' – muddyfish

+2

@muddyfish no,'time.clock()'在這裏使用肯定是錯誤的。 'time.clock()'是處理器時鐘時間(如果程序不使用任何時鐘週期,它將不會前進),而不是掛鐘時間('time.time()')。另請參閱:http://pymotw.com/2/time/ –

+0

啊,更正:在Windows上'time.clock()'實際上似乎正在返回掛鐘時間秒。 *嘆息* –

回答

0

根據您所使用的操作系統,你要麼需要使用time.time()time.clock()

針對Windows操作系統的,你將需要使用time.clock這個給你將時鐘秒爲float。 time.time()如果我沒有記錯,在windows上time.time()只在16ms內準確。

對於posix系統(linux,osx),您應該使用time.time()這是一個浮點數,它返回自epoch起的秒數。

在您的代碼中添加以下內容以使您的應用程序更加跨系統兼容。

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) 
    ... 
+0

你可能想''timeit.default_timer()' – jfs

1

使用time.monotonic()代替time.time()就解決了這個。 time.time()似乎用gettimeofdayat least here it does),這顯然是非常糟糕的測量,因爲NTP同步問題walltime差異:

的gettimeofday()和時間()應該只被用來獲取當前時間,如果當前牆壁時鐘的時間實際上是你想要的。它們決不能用於測量時間或將事件X時間安排到未來。

你平時不是在你的手錶,運行NTP協議,所以它可能不會在隨機的方向跳一兩秒鐘(或15分鐘),因爲它發生在同步起來反對在這一點上正常的時鐘。良好的NTP實現儘量不讓這樣的時間跳躍。 他們反而使時鐘變得更快或更慢,以便它會漂移到正確的時間。但是,當它漂移時,你可能有一個速度太快或太慢的時鐘。它沒有正確測量時間的流逝。

link)。所以基本上測量time.time()電話之間的差異是一個壞主意。

+0

當前的cpython可能會使用['clock_gettime(2)','GetSystemTimeAsFileTime()'](http://stackoverflow.com/a/28574340/4279)。你檢查過'time.time()'漂移,而'time.monotonic()'在你的情況下足夠準確嗎?什麼是你的操作系統,python版本? – jfs

+0

OSX,python 3.4.1。 'time.monotonic'沒有明顯的漂移,'time.time'肯定是漂移的。 – akxlr