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

113 投票
13 回答
138909 浏览
提问于 2025-04-15 12:56

我可以给它浮点数,比如说:

time.sleep(0.5)

但是它的准确性怎么样呢?如果我给它:

time.sleep(0.05)

它真的会睡大约50毫秒吗?

13 个回答

34

这是我对Wilbert回答的补充:关于Mac OS X Yosemite的情况,因为之前提到得不多。

看起来大部分时间,它的休眠时间大约是你请求时间的1.25倍,有时候则是在你请求时间的1到1.25倍之间。几乎从来不会(大约在1000次测试中只有两次)休眠时间明显超过你请求的1.25倍。

另外(虽然没有明确显示),这个1.25的关系在你请求的时间低于大约0.2毫秒时似乎保持得很好,之后就开始有点不稳定了。而且,当你请求的时间超过20毫秒时,实际的休眠时间似乎会比你请求的时间多出大约5毫秒。

再说一次,OS X中的sleep()实现方式似乎和Windows或Wilbert使用的某个Linux内核完全不同。

77

大家说得对,操作系统和内核之间确实有区别。不过,我在Ubuntu上没有看到什么细粒度的时间控制,而在MS7上却看到了1毫秒的细粒度。这里提到的不是只改变时间间隔,而是建议对time.sleep这个函数进行不同的实现。仔细观察后,我发现Ubuntu实际上有1微秒的细粒度,这主要是因为我用来测量准确性的time.time函数。

Linux和Windows在Python中time.sleep的典型行为
94

time.sleep这个函数的准确性取决于你电脑操作系统的休眠精度。对于像普通Windows这样的非实时操作系统,最短的休眠时间大约是10到13毫秒。我发现,当休眠时间超过这个最小值时,实际的休眠时间通常会在这个范围内的几毫秒之内。

更新:正如下面引用的文档所提到的,通常会在一个循环中进行休眠,这样如果你被提前叫醒了,就可以再继续休眠。

我还想提一下,如果你在使用Ubuntu,可以尝试安装一个伪实时内核(使用RT_PREEMPT补丁集),通过安装rt kernel包来实现(至少在Ubuntu 10.04 LTS中是这样)。

非实时的Linux内核的最小休眠时间更接近1毫秒,而不是10毫秒,但这个时间是不确定的,会有所变化。

撰写回答