【问题标题】:Millisecond precise python timer毫秒精确的python计时器
【发布时间】:2014-07-15 08:42:32
【问题描述】:

我正在编写一个旨在同时控制多个执行器的 Python 脚本。为简化起见,假设我需要控制 2 个电动机。

使用多处理模块,我为每个电机创建一个进程,以及一个将数据保存在工作表上的进程。

脚本的这部分工作正常,但是我需要在精确的时间、每毫秒命令我的电机,并且 time.time() 或 time.clock() 函数似乎不可靠(在 0.05 和 30 之间触发毫秒!)

这些函数如此不稳定是否“正常”,或者这是由我的脚本的另一部分引起的?

编辑:我使用 datetime 函数(见下文)来提高精度,但我仍然有几个离散级别的错误。例如,如果我想要 1ms,我也会得到 1.25、0.75、1.5... 所以 IMO 这是由于计算机硬件造成的(正如 Serge Ballesta 所说)。

【问题讨论】:

  • 您执行此操作的能力将高度依赖于您的硬件和操作系统。如果time.clock 没有为您提供所需的准确性,那么唯一真正的建议是尝试不同的硬件。

标签: python timer


【解决方案1】:

因为我“只”需要一个相对时间(每个命令之间 1 毫秒),你呢? 知道一种方法可以精确地做到这一点吗?

你可以期待的最好的结果是datetime.datetime.now(),它会给你微秒级的分辨率:

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2014, 7, 15, 14, 31, 1, 521368)
>>> i = datetime.datetime.now()
>>> q = datetime.datetime.now()
>>> (i-q).seconds
86389
>>> (i-q).microseconds
648299
>>> i.microsecond
513160

【讨论】:

  • 分辨率/精度与准确度不同。
  • 谢谢,它确实提高了一点精度,因为色散现在在 0.5 到 8 毫秒之间。
【解决方案2】:

恕我直言,问题不在您的脚本中,而更可能在您的机器上。我假设您在 Linux 或 Windows 下使用 标准 计算机。即使计算机能够在一毫秒内做很多事情,它也会不断地做:

  • 网络
  • 鼠标或键盘事件
  • 屏幕(包括屏幕保护程序...)
  • 防病毒软件(主要在 Windows 上)
  • 系统或守护进程(有很多
  • 多任务管理

如果没有专用的硬件设备,您无法可靠地希望获得一毫秒的精度,或者您必须使用实时系统。

编辑:

作为补充,这里引用了 Ulrich Eckhardt 对另一篇帖子 Inconsistent Python Performance on Windows 的回答:

您有执行串行 IO 的代码,这将阻塞您的进程并可能调用调度程序。如果发生这种情况,它将首先将控制权交给不同的进程,并且只有当该进程产生或超过其时间片时,它才会重新安排您的进程。

您的问题是:您正在运行的系统的调度程序时间片的大小是多少?我相信这会让您深入了解正在发生的事情。

【讨论】:

  • 这就是我所害怕的......因为我“只”需要一个相对时间(每个命令之间 1 毫秒),你知道精确的方法吗?
【解决方案3】:

我还不能给你评论(声誉),所以给你一个答案: 这只是一个线索: 尝试使用 cProfile 模块。

https://docs.python.org/2/library/profile.html

它可以让您检查脚本执行了多长时间,以及脚本中的每个函数。 cProfile 模块中的函数 .run() 返回有关脚本的精确统计信息。 也许它可以帮助你..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多