Time.sleep Python 计数器不准确?

Time.sleep inaccurate for Python counter?

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

我创建了这个脚本,它可以很好地计算一分钟(运行每分钟 2 秒);然而,当它应该 运行 一个小时时,它 运行 却持续了 47 分钟。

问题:有谁知道为什么我把它设置为一个小时后运行速度变快了? sleep.time 不准确吗?

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

首先,您的循环不仅包含睡眠语句——您在调用 time.sleep 之间所做的事情也需要时间,所以如果您重复 10 次,您将只花费 10%与在循环中进行 100 次迭代相比,执行这些操作的时间。

Is sleep.time inaccurate?

是的。或者好吧。相当.

我来自实时信号处理背景。 PC 时钟只是有些准确,您在 OS、标准库、脚本语言 运行 上花费的时间以及在硬件通知您的时间点之间的脚本逻辑您的时间已经过去,您的软件通知的时间点很重要。

请注意 Python 文档中对 time.sleep()

的引用

The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal's catching routine. Also, the suspension time may be longer than requested by an arbitrary amount because of the scheduling of other activity in the system.

作为一个建议,如果遇到这个问题,我会使用一个变量来跟踪间隔开始的时间。当睡眠醒来时,检查是否已经过了预期时间。如果不行,重启一个sleep补差价等

我刚刚注意到 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]