问题:python的time.sleep()有多准确?
我可以给它加上浮点数,例如
time.sleep(0.5)
但是它有多精确?如果我给它
time.sleep(0.05)
它真的会睡约50毫秒吗?
回答 0
time.sleep函数的准确性取决于您底层操作系统的睡眠准确性。对于非实时操作系统(如普通Windows),您可以睡眠的最小间隔约为10-13毫秒。在最小的10-13毫秒以上的时间里,我已经看到了几毫秒内的准确睡眠。
更新:就像在下面引用的文档中提到的那样,通常在一个循环中进行睡眠,这样可以确保在早起的情况下回到睡眠状态。
我还应该提到,如果您正在运行Ubuntu,则可以通过安装rt内核软件包(至少在Ubuntu 10.04 LTS中)来尝试伪实时内核(带有RT_PREEMPT补丁集)。
编辑:校正非实时Linux内核的最小睡眠间隔要比1ms再接近10ms,但是它以不确定的方式变化。
回答 1
人们对操作系统和内核之间的差异是完全正确的,但是我在Ubuntu中看不到任何粒度,在MS7中却看到1 ms的粒度。建议使用time.sleep的不同实现方式,而不仅是不同的滴答频率。仔细检查可以发现,在Ubuntu中粒度为1μs,但这是由于我用来测量精度的time.time函数所致。
回答 2
回答 3
这是我对Wilbert的回答的后续内容:对于Mac OS X Yosemite来说也是相同的,因为还没有被提及。
看起来很多时候它的睡眠时间约为您请求时间的1.25倍,有时甚至是您请求时间的1到1.25倍之间。它几乎从来不会(约1000个样本中的两倍)睡眠时间超过您请求时间的1.25倍。
同样(未明确显示),1.25关系似乎保持良好,直到您低于约0.2 ms,此后开始变得有点模糊。此外,在请求的时间超过20 ms之后,实际时间似乎比您请求的时间稳定了大约5 ms。
同样,它似乎是sleep()
OS X中与Windows或Linux内核Wilbert使用的完全不同的实现。
回答 4
为什么不找出来:
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和笔记本电脑(均为linux机器)上均出现约0.1ms的错误。
回答 5
回答 6
您不能真正保证关于sleep()的任何东西,除非它至少会尽您最大的努力使您进入睡眠状态(信号可以在时间到了之前杀死您的睡眠,还有更多事情可以使它运行)长)。
可以肯定的是,您在标准台式机操作系统上所能获得的最小值约为16毫秒(计时器粒度加上切换上下文的时间),但尝试时与提供的参数的%偏差可能会很大。睡了十毫秒。
信号,其他持有GIL的线程,内核调度的乐趣,处理器速度的提高等等,都可能在线程/进程实际睡眠的持续时间内造成严重破坏。
回答 7
如果您需要更高的精度或更少的睡眠时间,请考虑自己做:
import time
def sleep(duration, get_now=time.perf_counter):
now = get_now()
end = now + duration
while now < end:
now = get_now()
回答 8
最近在Windows 10上的Python 3.7上对此进行了测试。精度约为1毫秒。
回答 9
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────────────────────