【问题标题】:Python's time.sleep() method waits incorrect amount of timePython 的 time.sleep() 方法等待不正确的时间
【发布时间】:2014-10-10 21:23:39
【问题描述】:

我遇到过几次这个问题;重新启动 python 似乎工作(或 ipython)。但是,例如,这是运行以下代码的一种可能输出:

startt = time.time()
for i in range(4):
    time.sleep(1)
    print '%.3f'%(time.time()-startt)

我得到:

9.989
10.989
11.990
12.991

为什么要等这么久才开始工作?有时,它会在我运行命令后的 10 秒甚至 11 秒后启动。

我使用的是 Mac OS X (Mavericks)、IPython 1.2.1 (with pylab)、Python 2.7.5

我正在导入: os、cv2、time、random、Quartz、LaunchServies、pdb、sys、appscript 和 numpy。

【问题讨论】:

  • 这是相当惊人的。什么操作系统?什么版本的 Python?
  • Mac OS X(小牛队)、IPython 1.2.1、Python 2.7.5
  • 你是如何运行你的代码的?它在脚本中吗?一个函数?您是否将其复制并粘贴到交互式外壳中?我无法复制大的第一个值,但我确实在其余值之间始终得到略大于 1(这是意料之中的)

标签: python time


【解决方案1】:

根据time.sleep docs

在给定的秒数内暂停执行。该参数可以是一个浮点数,以指示更精确的睡眠时间。实际的挂起时间可能少于请求的时间,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。 此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长任意数量。

time.sleep 的实际等待时间无法保证,取决于主机系统的加载方式。如果您机器上的某些东西占用了资源,Python 进程可能会延迟直到恢复。

不过,几秒钟的延迟太高了。你有没有机会在 Python 交互式 shell 中尝试这个?如果是这样,它可能会干扰,例如:

>>> import time
>>> startt = time.time()
>>> for i in range(4):
...     time.sleep(1)
...     print '%.3f'%(time.time()-startt)
...
3.147
4.147
5.147
6.147
>>> startt = time.time()
>>> for i in range(4):
...     time.sleep(1)
...     print '%.3f'%(time.time()-startt)
...
4.949
5.949
6.949
7.949

因为startt = time.time() 在其余代码被写入或粘贴并被评估之前被评估,这可能需要几秒钟。

但是如果我将它包装在一个方法中,它的行为会如预期:

>>> def test():
...     startt = time.time()
...     for i in range(4):
...         time.sleep(1)
...         print '%.3f'%(time.time()-startt)
...
>>> test()
1.000
2.000
3.000
4.000

或放入脚本中:

import time

startt = time.time()
for i in range(4):
    time.sleep(1)
    print '%.3f'%(time.time()-startt)

# $ python test.py
# 1.000
# 2.008
# 3.008
# 4.008

在这种情况下,延迟应该以毫秒为单位,如后一个输出所示。我怀疑它可能会达到几秒钟。

【讨论】:

  • 不确定您是否可以像这样直接在控制台中输入内容。时间反映了在获得startt 之后您需要编写其他行的时间。您必须将其放入文件中并运行该文件。就我而言,没有滞后。
  • 在你的情况下,你在 3-4 秒内写了 3 行文本。非常令人印象深刻。
  • @ssm 您可以在交互式 shell 中键入或粘贴这样的内容,是的。你知道,我只是想知道为什么它会这样,直到你打我。我工作过度了......谢谢你:)
  • 是的!我一直在使用 IPython,因为我正在积极开发一个脚本,并使用 IPython 的(光荣的)魔术函数 %paste,它将剪贴板中的格式化文本输入到控制台中。尽管尝试了,但在 python 中运行脚本本身时,我无法重现问题。
  • 附录:如果我将它包装在一个方法中,如果该方法正在 IPython 中使用,则保证可以正常工作。然而,再次作为脚本执行,它似乎运行良好,尽管该脚本缺少我在 ipython 中使用的许多诊断功能(即,通过 opencv 渲染图像并通过 matplotlib 绘制图形)。
猜你喜欢
  • 2013-07-04
  • 2022-10-15
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2014-11-15
  • 2020-08-01
  • 1970-01-01
相关资源
最近更新 更多