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

时间:2009-07-15 20:33:42

标签: python time sleep

我可以给它浮点数,例如

time.sleep(0.5)

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

time.sleep(0.05)

它真的会在50毫秒左右睡觉吗?

12 个答案:

答案 0 :(得分:67)

time.sleep函数的准确性取决于您的基础操作系统的睡眠准确性。对于非实时操作系统,如股票Windows,您可以睡觉的最小间隔大约是10-13ms。我已经看到在超过最小10-13ms时的几毫秒内准确睡眠。

更新: 就像下面引用的文档中提到的那样,在循环中进行睡眠是很常见的,如果它提前唤醒你就会确保重新入睡。

我还要提一下,如果你正在运行Ubuntu,你可以通过安装rt内核包(至少在Ubuntu 10.04 LTS中)尝试伪实时内核(使用RT_PREEMPT补丁集)。

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

答案 1 :(得分:48)

人们对操作系统和内核之间的差异非常正确,但我没有看到Ubuntu中的任何粒度,我在MS7中看到了1 ms的粒度。建议不同的time.sleep实现,而不仅仅是不同的滴答速率。仔细检查表明Ubuntu中的粒度为1μs,但这是由于我用于测量精度的time.time函数。 Linux and Windows typical time.sleep behaviour in Python

答案 2 :(得分:25)

来自documentation

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

more specifically w.r.t. sleep()

  

暂停给定号码的执行   几秒钟争论可能是一个   浮点数表示a   更准确的睡眠时间。实际上   暂停时间可能不如   请求,因为任何捕获信号   将终止{{1}}以下   执行该信号的捕获   常规。此外,暂停时间可以   比一个人的要求更长   任意数量因为   安排其他活动   系统

答案 3 :(得分:15)

你为什么不知道:

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。

答案 4 :(得分:14)

以下是我对Wilbert的回答的跟进:Mac OS X Yosemite也是如此,因为它还没有被提及。Sleep behavior of Mac OS X Yosemite

看起来很多时候它的睡眠时间大约是您要求的时间的1.25倍,有时会在您请求的时间内睡眠时间的1到1.25倍。它几乎从不(1000个样本中的两个)睡眠时间远远超过您要求的1.25倍。

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

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

答案 5 :(得分:3)

一个小小的纠正,有几个人提到睡眠可以通过信号提前结束。在the 3.6 docs,它说,

  

版本3.5中已更改:即使此功能现在至少休眠几秒   除了信号处理程序之外,睡眠被信号中断   引发异常(请参阅PEP 475了解原因)。

答案 6 :(得分:2)

你无法真正保证睡眠(),除非你告诉它至少会尽力睡觉(信号可以在时间到来之前杀死你的睡眠,还有更多东西可以让它运行得很长。)

可以肯定的是,标准桌面操作系统的最小值大约为16毫秒(计时器粒度加上上下文切换时间),但是当您使用时,与提供的参数的偏差可能会很大。 '试着睡几十毫秒。

信号,持有GIL的其他线程,内核调度乐趣,处理器速度步进等都会对线程/进程实际休眠的持续时间造成严重破坏。

答案 7 :(得分:1)

准确性

time.sleep(0.05)应该和您的互联网连接一样准确。如果您的互联网连接正常,那么time.sleep()括号中的数字会不断增加。

答案 8 :(得分:1)

如果您需要更高的精度或更少的睡眠时间,请考虑自己动手:

import time

def sleep(duration, get_now=time.perf_counter):
    now = get_now()
    end = now + duration
    while now < end:
        now = get_now()

答案 9 :(得分:0)

最近在Windows 10上的Python 3.7上对此进行了测试。精度约为1毫秒。

答案 10 :(得分:0)

def start(self):
    sec_arg = 10.0
    cptr = 0
    time_start = time.time()
    time_init = time.time()
    while True:
        cptr += 1
        time_start = time.time()
        time.sleep(((time_init + (sec_arg * cptr)) - time_start ))

        # AND YOUR CODE .......
        t00 = threading.Thread(name='thread_request', target=self.send_request, args=([]))
        t00.start()

请勿使用变量传递sleep()的参数,必须将计算结果直接插入sleep()


我的终端机返回

1─────17:20:16.891───────────────

2──────17:20:18.891────────────────

3─────17:20:20.891────────────────

4──────17:20:22.891────────────────

5─────17:20:24.891───────────────

....

689───17:43:12.891────────────────

690───17:43:14.890────────────────

691────17:43:16.891──────────────────

692───17:43:18.890────────────────

693────17:43:20.891────────────────

...

727───17:44:28.891────────────────

728───17:44:30.891──────────────────

729────17:44:32.891────────────────

730───17:44:34.890────────────────

731────17:44:36.891──────────────────

答案 11 :(得分:0)

def test():
    then = time.time()  # get time at the moment
    x = 0
    while time.time() <= then+1:  # stop looping after 1 second
        x += 1
        time.sleep(0.001)  # sleep for 1 ms
    print(x)

在Windows 7 / Python 3.8上,即使我将sleep值设置为1000

也为我返回了0.0005

那么完美1ms