python的time.sleep()有多准确?

我可以给它浮点数,比如

time.sleep(0.5) 

但是它有多准确呢? 如果我给它

 time.sleep(0.05) 

它真的会睡大约50毫秒?

time.sleepfunction的准确性取决于底层操作系统的睡眠准确度。 对于非实时操作系统,就像一个股票Windows,你可以睡的最小时间间隔是10-13ms。 当在10-13ms以上时,我已经看到准确的睡眠时间在几毫秒内。

更新:就像在下面的文档中提到的那样,在一个循环中进行睡眠是很常见的,如果在早期唤醒你的话,它将确保回到睡眠状态。

我还应该提到,如果您正在运行Ubuntu,则可以通过安装rt内核软件包(至less在Ubuntu 10.04 LTS中)来尝试伪实时内核(使用RT_PREEMPT补丁集)。

编辑:纠正非实时Linux内核有最小的睡眠时间间隔接近1毫秒,然后10毫秒,但它以不确定的方式变化。

人们对操作系统和内核之间的差异是非常正确的,但是在Ubuntu中我看不到任何粒度,我在MS7中看到1 ms的粒度。 build议time.sleep的一个不同的实现,不只是一个不同的节拍率。 更仔细的检查表明Ubuntu的粒度在1μs左右,但这是由于我用来测量精度的time.time函数。 Linux和Windows通常在Python中运行

从文档 :

另一方面, time()sleep()的精度优于它们的Unix等价物:时间表示为浮点数, time()返回最准确的时间(使用Unix gettimeofday如果可用))和sleep()将接受一个非零分数的时间(Unix select是用来实现这一点,如果可用)。

更具体地说, sleep()

暂停执行给定的秒数。 该参数可能是一个浮点数,以表示更准确的睡眠时间。 实际的中止时间可能会less于所要求的时间,因为任何捕捉到的信号都会在执行该信号的捕捉程序之后终止sleep() 。 而且,由于系统中的其他活动的调度,中止时间可能比任意量所要求的更长

你为什么不知道:

 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 

为了logging,我得到了我的HTPC 0.1毫秒的错误和我的笔记本电脑,这两个Linux机器2毫秒。

这里是我对威尔伯特的回答的后续:对于Mac OS X优胜美地,这是相同的,因为它还没有被提及。 睡眠行为的Mac OS X优胜美地

看起来好像有很多时间睡在你请求的时间的1.25倍左右,有时候会睡眠你请求的时间的1到1.25倍。 几乎从来没有(约1000个样品中的两倍)睡眠时间明显超过您要求的1.25倍。

另外(没有明确显示)1.25的关系似乎保持不错,直到你低于大约0.2毫秒,之后它开始有点模糊。 另外,在请求的时间超过20毫秒之后,实际时间似乎比您请求的时间长5毫秒。

同样,在OS X中,它似乎是一个完全不同的sleep()实现,而不是Windows中的任何一个Linux核心Wilbert所使用的。

你不能保证任何有关睡眠的东西,除非睡眠时间至less要尽最大的努力才能睡觉(信号可以在时间到了之前消灭你的睡眠,而更多的东西可以让它运行长)。 可以肯定的是,标准桌面操作系统上的最低限度是16ms左右(定时器的粒度加上上下文切换的时间),但是当你尝试的时候,提供的参数的偏差会很大睡10s毫秒。 信号,其他保持GIL的线程,内核调度的乐趣,处理器的速度步进等等,都可以对线程/进程实际hibernate的持续时间造成破坏。