【问题标题】:How can I theoretically program a stopwatch?我如何在理论上对秒表进行编程?
【发布时间】:2012-08-19 08:58:57
【问题描述】:

这是我在 stackoverflow.com 上的第一个问题,所以请对我宽容:) 我有一个关于如何从理论上创建秒表程序的问题。用哪种语言编写对我来说并不重要。理论上可以吗?

a = 0
While 1 == 1:
    Print(a)
    Sleep(1s)
    a = a+1

这对我来说应该没问题,但是在 Python 中运行类似的东西时,它不能准确地打印出来。用我的“现实生活”模拟秒表测量,有时不到 1 秒,有时超过 1 秒。我想知道的是如何仅在理论上创建秒表,我不需要实际的代码。我希望你能理解我的问题,等待回复:)

【问题讨论】:

  • 我做了这个:import datetime now = datetime.datetime.now() while 1 == 1: print(now.second) 我的问题是:为什么它只打印一个值?在我的输出中,我可以看到:12 12 12 12 12 12 12 12 12 12 12 我知道这有点离题,但不值得提出一个新问题。
  • 因为在进入循环之前,您只设置了一次 now 变量。您需要更新 now 变量,因此您需要在循环中设置它。

标签: python timer sleep stopwatch


【解决方案1】:

看看这个:Stopwatch In Python

所以,回答你的问题:是的,有可能。

至于你原码的准确性:How accurate is python's time.sleep()?

【讨论】:

  • 谢谢,所以如果“对于像普通 Windows 这样的非实时操作系统,您可以休眠的最小间隔约为 10-13 毫秒。”,我如何创建一个精确的秒表,以千分之一秒计数?例如,0.001 0.002?
  • 这是另一个例子和一些关于分辨率的讨论,stackoverflow.com/questions/1938048/…
  • @MichałDurak 如果最小间隔是10-13ms,我不确定你是否真的可以按毫秒计算。
【解决方案2】:

sleep,不能保证在给定的确切时间内睡眠;它会睡大约那个时间,但它可能会有点过。当然,如果每次都偏离同一个方向,那会开始累积,最终你的答案会很偏离。

幸运的是,您的计算机带有一个不会很快漂移的时钟,您可以将其用作秒表。与其每次睡一秒钟,不如睡更短的时间(例如百分之一秒)。每次醒来,测试当前时间。如果您的开始时间已经过了一秒钟,请打印出来。

【讨论】:

  • 那么,我的电脑时钟是如何制造的,它不会漂移那么快?非常复杂的软件,还是硬件?
  • @Micechal 实际上是一个组合。有一个称为real-time clock 的硬件可以跟踪时间。这不会很快漂移。它基本上相当于一个带有晶体振荡器的数字手表,并且它也有一个电池,即使你的电脑关闭也可以保持时间。但是,它最终会漂移,因此network time protocol, NTP 用于使其与更准确的时钟保持同步,例如用于设定官方时间标准的原子钟。
【解决方案3】:

打印以非常规方式发生的原因可能是输出正在缓冲。如果您禁用标准输出的缓冲,它应该可以按预期工作;见Disable output buffering

运行现有脚本时,您可以通过向python 提供-u 选项来实现这一点(至少在Linux 上)。来自man python

-u 强制标准输入、标准输出和标准错误完全无缓冲。在重要的系统上,也将 stdin、stdout 和 stderr 放入 二进制模式。 请注意,在 xreadlines()、readlines() 和文件对象迭代器(“for line in sys.stdin”)中有内部缓冲 不受影响 受此选项。要解决这个问题,您需要在“while 1:”循环中使用“sys.stdin.readline()”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多