我可以给它浮点数,例如
time.sleep(0.5)
但它有多准确?如果我给它
time.sleep(0.05)
它真的会在50毫秒左右睡觉吗?
答案 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函数。
答案 2 :(得分:25)
另一方面,精度time()
和sleep()
优于time()
他们的Unix等价物:时间是 表示为浮点数,gettimeofday
会返回最准确的时间 可用(使用Unixsleep()
如果有的话),select
会 接受非零分数的时间 (Unixsleep()
用于实现 这个,如果有的话)。
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也是如此,因为它还没有被提及。
看起来很多时候它的睡眠时间大约是您要求的时间的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