Можно ли измерить точное время в миллисекундах между несколькими операторами кода, используя python? - PullRequest
0 голосов
/ 16 апреля 2019

Я занимаюсь разработкой приложения на Python с использованием Python2.7.Это приложение использует библиотеку pyserial для чтения некоторых байтов данных из последовательного порта.Использование цикла while для чтения 1 байта данных в каждой итерации.В каждой итерации я должен измерять время выполнения между операторами, если оно меньше 10 мс, дождаться, пока оно достигнет 10 мс, прежде чем начинать следующую итерацию.здесь есть два вопроса:

  1. Измерение времени

Как лучше всего измерить время между операторами Python с точностью (допустимая разница 1 мс или 2 мс)миллисекунд.

Время задержки

Как использовать это измеренное время для задержки, чтобы дождаться, пока общее время не станет 10 мс (общее время = 10 мс = время выполнения кода + задержка)

Я пробовал библиотеку времени, но она не дает хорошего разрешения, когда в миллисекундах некоторое время она ничего не дает при небольшой продолжительности времени.например:

import time
while uart.is_open:
uart.read() 
start = time.time()
#user code will go here

end = time.time()
execution_time=end - start
if execution_time< 10ms:
remaining_time = 10ms - execution_time
delay(remaining_time)

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Решение:

Мне удалось получить разрешение 1 мс, выполнив две вещи.

  1. Изменена (увеличена) скорость передачи до 115200 с 19200.

  2. Используется time.clock (), а не time.time (), поскольку он имеет большую точность и разрешение.

0 голосов
/ 17 апреля 2019

Вы можете получить строку в минутах: секундах: микросекундах, используя datetime примерно так:

import datetime
string = datetime.datetime.now().strftime("%M:%S:%f")

А затем превратить ее в число, чтобы сделать сравнение более удобным:

m, s, u = string.split(":")
time_us = float(m)/60e6 + float(s)/1e6 + float(u)

В вашем примере это будет выглядеть так:

import datetime
def time_us_now():
    h, m, s, u = (float(string) for string in datetime.datetime.now().strftime("%H:%M:%S:%f").split(":"))
    return h/3600e6 + m/60e6 + s/1e6 + u

start = time_us_now()
# User code will go here.
end = time_us_now()
execution_time = end - start
...