最近,在最后创建一个等待时间非常短的循环时,我在快速连续使用时遇到time.sleep()
的意外行为。
我使用这段代码来深入研究我的问题
import time
import statistics
def average_wait(func):
waits=[]
loops=0
while loops<1000:
start=time.time()
func(1/1000)
waits.append(time.time()-start)
loops+=1
print(waits)
print("Average wait for 0.001: {}".format(statistics.mean(waits)))
average_wait(time.sleep)
这个函数通常会返回大约0.0013的值,这比仅调用time.sleep()
一次要精确许多倍,在通过查看waits
列表进一步检查此问题后,我发现了实际上睡觉的时间time.sleep()
要么几乎都是恰当的时间,要么几乎是时间的两倍。
以下是waits
的示例:
[0.0010008811950683594, 0.0020041465759277344, 0.0009999275207519531, 0.0019621849060058594, 0.0010418891906738281]
这种行为是否有任何理由以及可以采取哪些措施来避免这种行为?
答案 0 :(得分:2)
请注意,即使时间始终作为浮点数返回,但并非所有系统都提供的精度高于1秒。
精度取决于平台。此外,它产生挂钟时间,您的过程永远不是现代操作系统上唯一运行的过程,其他过程也有时间处理,您将看到自己的过程中的时间变化因为那个。
该模块提供不同的时钟,精度更高,有些是每个进程。请参阅time.get_clock_info()
function以了解它们提供的精确度。注意time.process_time()
提供每个进程时间但不包括睡眠时间。
接下来,time.sleep()
也不会在确切的时间跨度内睡觉;再次来自relevant documentation:
由于系统中其他活动的安排,暂停时间可能比任意金额要求的时间长。
它也受操作系统调度的影响。
总之,这些效果可以轻松累加到您在实验中看到的时间的毫秒变化。所以这不是睡觉时间的倍增;即使您为time.sleep()
使用了不同的值,您仍然会看到与请求时间相似的偏差。