毫秒精确的python计时器

时间:2014-07-15 08:42:32

标签: python timer

我处理一个python脚本,旨在同时控制多个执行器。为简化起见,假设我需要控制2台电动机。

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

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

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

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

3 个答案:

答案 0 :(得分:3)

  

由于我“只”需要相对时间(每个命令之间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

答案 1 :(得分:2)

恕我直言,问题不在您的脚本中,但更可能在您的机器中。我假设您在Linux或Windows下使用标准计算机。即使计算机能够在一毫秒内完成许多工作,它仍然可以:

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

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

编辑:

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

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

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

答案 2 :(得分:0)

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

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

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