xticks用法 - python點圖




python的time.sleep()有多準確? (5)

我可以給它浮點數,比如

time.sleep(0.5)

但它有多準確? 如果我給它

time.sleep(0.05)

它真的睡了大約50毫秒?


time.sleep函數的準確性取決於您的基礎操作系統的睡眠準確性。 對於非實時操作系統,如股票Windows,您可以睡覺的最小間隔大約是10-13ms。 我已經看到在超過最小10-13ms時的幾毫秒內準確睡眠。

更新:如下面的文檔中提到的,在循環中進行睡眠是很常見的,如果它提前喚醒你,它將確保重新進入睡眠狀態。

我還要提一下,如果你正在運行Ubuntu,你可以通過安裝rt內核包(至少在Ubuntu 10.04 LTS中)嘗試偽實時內核(使用RT_PREEMPT補丁集)。

編輯:更正非實時Linux內核的最小睡眠間隔更接近1毫秒然後10毫秒但它以非確定性方式變化。


一個小的糾正,幾個人提到睡眠可以通過信號提前結束。 在它說的3.6文檔中

在版本3.5中更改:即使睡眠被信號中斷,該函數現在至少休眠秒,除非信號處理程序引發異常(參見PEP 475的基本原理)。


你不能真正保證睡眠()的任何事情,除非你告訴它至少會盡力睡覺(信號可以在時間到來之前殺死你的睡眠,更多東西可以使它運行長)。

可以肯定的是,標準桌面操作系統的最小值大約為16ms(計時器粒度加上上下文切換時間),但是當你嘗試時,與提供的參數的偏差可能會很大。睡幾十毫秒。

信號,持有GIL的其他線程,內核調度樂趣,處理器速度步進等等都會對線程/進程實際休眠的持續時間造成嚴重破壞。


你為什麼不知道:

from datetime import datetime
import time

def check_sleep(amount):
    start = datetime.now()
    time.sleep(amount)
    end = datetime.now()
    delta = end-start
    return delta.seconds + delta.microseconds/1000000.

error = sum(abs(check_sleep(0.050)-0.050) for i in xrange(100))*10
print "Average error is %0.2fms" % error

為了記錄,我的HTPC上的錯誤大約為0.1ms,而我的筆記本電腦上的這兩台Linux機器上的錯誤都是2ms。


這是我對Wilbert的回答的後續跟進:Mac OS X Yosemite也是如此,因為它還沒有被提及。

看起來很多時候它的睡眠時間大約是您要求的時間的1.25倍,有時會在您請求的時間內睡眠時間的1到1.25倍。 它幾乎從不(1000個樣本中的兩個)睡眠時間遠遠超過您要求的1.25倍。

同樣(未明確顯示)1.25關係似乎保持相當好,直到你低於約0.2毫秒,之後它開始變得有點模糊。 此外,在請求的時間超過20毫秒後,實際時間似乎比您請求的時間長約5毫秒。

同樣,它似乎是OS X中的sleep()完全不同於在Windows或者任何Linux內核Wilbert使用的實現。





sleep