【问题标题】:python - issues with time.clock()/time()python - time.clock()/time() 的问题
【发布时间】:2015-04-07 17:57:48
【问题描述】:

我编写了一个系统来在 arduino nano 和我的 python 脚本之间交换经过 crc 检查的结构数据。这工作得很好,但是当我让系统运行时,我的 python 监视器上出现了意外的输出(使用 pycharm)

print "Took", (time.time() - timeout), "s" 有时会打印出 Take 0.0 s。 通常它会打印 Take 0.0160000324249 s。 使用win7-64bit专业版。

From time doc : 以浮点数的形式返回自纪元以来的时间(以秒为单位)。请注意,尽管时间总是以浮点数形式返回,但并非所有系统都提供比 1 秒更好的精度。

我正在寻找类似millis() 的东西,这对我的情况来说足够精确

代码 Python:

import serial
import time
import binascii
import struct
from ctypes import *    

arduino = serial.Serial()
def receive_struct2():
  start = 0x85
  detected_start = False
  arduino.baudrate = 57600
  arduino.timeout = 0
  arduino.port = 'COM8'
  try:
    arduino.open()
  except serial.SerialException, e:
    print e

  while True:
     if(arduino.inWaiting() >= 1 and detected_start == False):
        data = ord(arduino.read())
        if data == start:
          print "Detected begin"
          detected_start = True
        else: print chr(data),

     if arduino.inWaiting() >= 1 and detected_start == True:
       message_length = ord(arduino.read())
       #print "Got message length ", message_length
       timeout = time.time()
       while time.time() - timeout <= 0.3 and arduino.inWaiting() <  message_length-1:pass
       print "Took ", (time.time() - timeout), " s"
       ....

【问题讨论】:

  • 不相关:应该有一种方法可以在没有繁忙循环的情况下等待 I/O(select() Windows 上的模拟)检查 aurdino API 文档。实现繁忙循环的更好方法是使用截止日期:deadline = timer() + 0.3; while timer() &lt; deadline and ...。注意:有不同的有用计时器定义:系统范围与进程范围值,已知来源与仅相对值有用,计算睡眠时间和/或子进程中的时间等。例如阅读@987654321 @

标签: python time


【解决方案1】:

总结:使用timeit.default_timer() 而不是time.time(),来衡量一个较短的持续时间。


time.time() 的 16 毫秒错误在 Windows 上并不奇怪。

目前,Python 使用GetSystemTimeAsFileTime() 在 Windows 上实现time.time(),分辨率(精度)为 0.1 毫秒(而不是ftime() 的 1 毫秒),精度在 0.5 毫秒到 15 毫秒之间(您可以使用NtSetTimerResolution()在系统范围内更改它)。请参阅 Python 错误:Use GetSystemTimeAsFileTime() to get a resolution of 100 ns on Windows 和另一个 SO 问题:How does python's time.time() method work?

在 Windows 上测量短时间间隔的更好替代方法是使用 time.clock(),它是在 Windows 上使用 QueryPerformanceCounter() 实现的。对于可移植性,您可以使用timeit.default_timer,在Windows 上分配给time.clock(),在其他系统上使用time.time(),从Python3.3 开始它是time.perf_counter()。见Python - time.clock() vs. time.time() - accuracy?

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 2013-10-24
    • 2010-09-10
    • 2016-07-21
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多