2015-02-07 46 views
0

我寫了一個系統來在arduino nano和我的python腳本之間交換crc-checked結構數據。這是工作得很好,但是當我讓系統運行我得到意想不到的輸出在我的python監視器(使用pycharm)python - time.clock()/ time()的問題

print「Took」,(time.time() - timeout),「s」有時打印出Took 0.0秒。 通常它會打印0.0160000324249秒。 使用win7-64bit專業版。

從時間文檔:返回自紀元以來的秒數作爲浮點數。請注意,即使時間總是以浮點數形式返回,但並非所有系統的時間精度都比1秒高。

I'm尋找類似米利斯()這就是足夠的精度對我的情況

代碼的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" 
     .... 
+0

不相關:應該有一種方法來等待I/O沒有繁忙的循環(Windows上的'select()'模擬)檢查aurdino API文檔。實現繁忙循環的更好方法是使用截止日期:'deadline = timer()+ 0.3;而timer()<截止時間和...'。注意:有不同的有用的定時器定義:全系統範圍與全過程值,已知原點對比只有相對值是有用的,在子過程中計數睡眠時間和/或時間等等。例如,讀[ time.monotonic()','time.perf_counter()','time.process_time()'definitions](https://docs.python.org/3/library/time.html#time.monotonic) – jfs 2015-02-07 19:45:52

回答

1

摘要:使用timeit.default_timer()而不是time.time(),測量時間短。


對於Windows,time.time()的16ms錯誤並不奇怪。

目前,Python使用GetSystemTimeAsFileTime()實現在Windows time.time()擁有0.1ms的(而不是ftime()的1毫秒)的分辨率(精度)和精度爲0.5毫秒和15毫秒之間(你可以改變它的全系統使用NtSetTimerResolution())。請參閱Python bug:Use GetSystemTimeAsFileTime() to get a resolution of 100 ns on Windows和另一個SO問題:How does python's time.time() method work?

在Windows上測量短時間間隔的更好方法是使用在Windows上使用QueryPerformanceCounter()實現的time.clock()。爲了便於攜帶,您可以使用timeit.default_timer,它分配給Windows上的time.clock(),其他系統上分配爲time.time(),自Python3.3以來它是time.perf_counter()。見Python - time.clock() vs. time.time() - accuracy?