Time.sleep对于Python计数器不准确?

时间:2015-05-06 11:25:51

标签: python python-2.7 time sleep

我想为工作中的销售团队创建一个收入计数器,并且很乐意使用Python。例如。 Joe Bloggs将他的目标从22.1转移到23.1(相差1.0)。我希望计数器在一小时内从22.1到23.1均匀分布。

我已经创建了这个脚本,可以正常计算一分钟(每分钟运行2秒);然而,当它应该运行一个小时,它运行47分钟。

问题:当我将它设置为一小时时,有谁知道为什么它运行得更快?睡觉时间不准确吗?

import time

def rev_counter(time_length):
    time_start = (time.strftime("%H:%M:%S"))

    prev_pp = 22.1
    new_pp = 23.1

    difference = new_pp - prev_pp

    iter_difference = (difference / 100000.) # Divide by 100,000 to show 10 decimal places
    time_difference = ((time_length / difference) / 100000.)     

    i = prev_pp

    while i < new_pp:
        print("%.10f" % i)
        i = i + iter_difference
        time.sleep(time_difference)

    time_end = (time.strftime("%H:%M:%S"))

    print "Time started at", time_start
    print "Time ended at", time_end

rev_counter(60) # 60 seconds. Returns 62 seconds
rev_counter(600) # 10 minutes. Returns 10 minutes, 20 secs
rev_counter(3600) # 1 hour. Returns 47 minutes

3 个答案:

答案 0 :(得分:2)

请注意time.sleep()

的Python文档中的引用
  

实际的暂停时间可能比请求的少,因为任何   捕获信号将在执行后终止sleep()   信号的捕捉程序。此外,暂停时间可能更长   由于调度而导致的任意金额要求   系统中的其他活动。

作为建议,如果遇到这个问题,我会使用一个变量来跟踪间隔开始的时间。睡眠醒来时,检查预计的时间是否已经过去。如果没有,请重新启动睡眠以获得差异等等。

答案 1 :(得分:1)

首先,你的循环不仅包含睡眠陈述 - 你在调用time.sleep之间做的事情也需要时间,所以如果你做了10次重复,你只会花掉与通过循环进行100次迭代时相比,10%的时间都是这样做的。

  

睡眠时间不准确吗?

是。或者好吧。相当。

我来自实时信号处理背景。 PC时钟只是有点准确,你在操作系统上花费的时间,标准库,脚本语言运行时间和脚本逻辑在硬件通知你时间已经过去的时间点和你的时间点之间您的软件通知时间非常重要。

答案 2 :(得分:0)

我刚注意到time.sleep占用太长时间(输入值在.0001到1秒之间的时间长5-30000倍),并且搜索答案,找到了这个帖子。我运行了一些测试,并且一直这样做(参见下面的代码和结果)。奇怪的是,我重新启动,然后恢复正常,工作非常准确。当代码开始挂起时,time.sleep需要10000次太长时间?! 因此重启是一种临时解决方案,但不确定原因是什么/永久解决方案。

import numpy as np 
import time

def test_sleep(N,w): 
    data = []
    for i in xrange(N): 
        t0 = time.time()
        time.sleep(w)
        t1 = time.time()
        data.append(t1-t0)
    print "ave = %s, min = %s, max = %s" %(np.average(data), np.min(data), np.max(data))
    return data


data1 = test_sleep(20,.0001)
Out: ave = 2.95489487648, min = 1.11787080765, max = 3.23506307602

print data1
Out: [3.1929759979248047,
 3.121081829071045,
 3.1982388496398926,
 3.1221959590911865,
 3.098078966140747,
 3.131525993347168,
 3.12644100189209,
 3.1535091400146484,
 3.2167508602142334,
 3.1277999877929688,
 3.1103289127349854,
 3.125699996948242,
 3.1129801273345947,
 3.1223208904266357,
 3.1313750743865967,
 3.1280829906463623,
 1.117870807647705,
 1.3357980251312256,
 3.235063076019287,
 3.189779043197632]

data2 = test_sleep(20, 1)
Out: ave = 9.44276217222, min = 1.00008392334, max = 10.9998381138

print data2
Out: [10.999573945999146,
 10.999622106552124,
 3.8115758895874023,
 1.0000839233398438,
 3.3502109050750732,
 10.999613046646118,
 10.99983811378479,
 10.999617099761963,
 10.999662160873413,
 10.999619960784912,
 10.999650955200195,
 10.99962306022644,
 10.999721050262451,
 10.999620914459229,
 10.999532222747803,
 10.99965500831604,
 10.999596118927002,
 10.999563932418823,
 10.999600887298584,
 4.6992621421813965]