2017-05-04 26 views
1

this後,我已經確定了Windows 7下的Python的time.sleep()函數的非函數實現(Enterprise,64位和Python 3.4.4)。不準確的time.sleep()與Python 3.x和Windows 7

這裏的參考的.py腳本:

import threading, time 

def Return(): 
    return 

def Setup(): 
    for _ in range(10): 
     time_before = time.time() 
     Return() 
     wait_delay = -time.time() 

     delays = [] 
     InputFrequency = 60 

     while (time.time() - time_before) < (1/InputFrequency): 
      time.sleep(0) 

     wait_delay += time.time() 

     delays.append(wait_delay) 

     print("Output frequency: " + str([1/t for t in delays][0]) + " Hz") 

threading.Thread(target=Setup).start() 

作爲每this例如,該腳本應該產生的60Hz的大致的輸出頻率。然而,當我的Windows 7企業版的機器上運行,這些都是輸出頻率,我收到了一個給定的輸入頻率:

輸入:爲10Hz - 輸出:9.15Hz


輸入範圍:20Hz - 輸出:16.03赫茲


輸入:30Hz的 - 輸出21.37Hz


輸入範圍:40Hz的 - 6 4赫茲 - 輸出:32.05Hz


輸入範圍:在65Hz - 10kHz的+ - 輸出:64.10Hz


這到底是怎麼回事?爲什麼變化的輸入頻率(40Hz以上)會產生相同的輸出頻率?即使輸入頻率超過10,000Hz,爲什麼輸出頻率上限爲64.10Hz?我不相信這是〜60Hz時的time.sleep()分辨率問題。提供給ideone.com腳本的相同輸入頻率值會產生預期的輸出頻率,因此它必須與我的計算機相關。

+0

您是否檢查過當前版本的python是否有所作爲? – pvg

+0

我沒有,但我剛剛檢查了我的Python 2.7.12安裝,它給出了相同的錯誤輸出頻率。 – jars121

+0

沒錯,但是你的基準是python 3,所以看起來python 3.6可能是一個開始的地方。 – pvg

回答

1

Python對於這些調用將如何表現,特別是跨平臺,提供了很少的保證。有兩件事可能在這裏出錯 - time.time()的分辨率比您試圖實現的分辨率或sleep的分辨率差。

睡眠應該大概至少1至2毫秒準確近期平臺報告如下:

How accurate is python's time.sleep()?

這使得time.time()。這個特定呼叫的文檔警告的準確性可能會很差:

注意,即使時間總是返回浮點 數量,而不是所有的系統提供時間比1 第二一個更好的精度。雖然此函數通常返回非遞減值,但如果系統時鐘的 已在兩次調用之間回退,則它可返回比先前調用更低的值。

幸運的是,在time.perf_counter()中提供了更高分辨率的時鐘API,它嘗試訪問平臺上可用的最高分辨率時鐘。從文檔:

返回的值(分數秒)的性能計數器的,即 具有可用的最高分辨率來測量一個短的持續時間 的時鐘。它包括睡眠時間,並且系統範圍爲 。返回值的參考點未定義, ,因此只有連續調用 的結果之間的差異才有效。

在Windows的情況下,這似乎比60Hz更好,它可以解決您的問題。

+0

完美,再次感謝! – jars121