意外的time.sleep()行为

时间:2018-01-12 16:40:01

标签: python python-3.x performance time sleep

最近,在最后创建一个等待时间非常短的循环时,我在快速连续使用时遇到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]

这种行为是否有任何理由以及可以采取哪些措施来避免这种行为?

1 个答案:

答案 0 :(得分:2)

来自time.time() documentation

  

请注意,即使时间始终作为浮点数返回,但并非所有系统都提供的精度高于1秒。

精度取决于平台。此外,它产生挂钟时间,您的过程永远不是现代操作系统上唯一运行的过程,其他过程有时间处理,您将看到自己的过程中的时间变化因为那个。

该模块提供不同的时钟,精度更高,有些是每个进程。请参阅time.get_clock_info() function以了解它们提供的精确度。注意time.process_time()提供每个进程时间但不包括睡眠时间。

接下来,time.sleep()也不会在确切的时间跨度内睡觉;再次来自relevant documentation

  由于系统中其他活动的安排,暂停时间可能比任意金额要求的时间长。

它也受操作系统调度的影响。

总之,这些效果可以轻松累加到您在实验中看到的时间的毫秒变化。所以这不是睡觉时间的倍增;即使您为time.sleep()使用了不同的值,您仍然会看到与请求时间相似的偏差。