#python #python-2.7 #datetime #time #sampling
#python #python-2.7 #дата и время #время #выборка
Вопрос:
В настоящее время я пытаюсь (Python 2.7) установить действие, которое будет выполняться с фиксированной частотой дискретизации (т. Е. Каждые x миллисекунд). Однако я сталкиваюсь с неточными результатами. С приведенным ниже кодом (частота дискретизации 1000 Гц, код выполняется в течение 5 секунд) Я ожидал бы иметь 5 * 10000 образцов. Вместо этого я получаю более низкие значения. Я хотел бы иметь частоту дискретизации в лучшем случае 5000 Гц, но я также был бы доволен частотой 1000 Гц.
Кто-нибудь может мне помочь?
import datetime
count = 0
loop_start_time = start_time = datetime.datetime.now()
while datetime.datetime.now() - loop_start_time <= datetime.timedelta(0,5,0): #loop for 5 seconds
if datetime.datetime.now() - start_time >= datetime.timedelta(0,0,1000): #perform an action every 1000 microseconds (1 millisecond, 0.1 seconds)
start_time = datetime.datetime.now()
count = count 1
print count
С наилучшими пожеланиями,
T2
Комментарии:
1. Есть ли какая-то конкретная причина, по которой вы используете datetime вместо таймера потоков?
2. docs.python.org/2/library/threading.html#timer-objects — для более подробной информации. У вас может быть внешний таймер, который отсчитывает 5000 миллисекунд (5 секунд), и внутри него другой таймер, который запускается каждые 1 мс.
3. Привет @Andrew. Большое спасибо за ваш ответ. Я не знал о таймере обработки потоков! Обрабатывает ли он частоту до 5000 Гц?
4. Привет, Эндрю. У меня возникают проблемы с использованием объектов timer, поскольку он запускается только один раз. Как мне заставить его работать, пока я не остановлю его? Это мой текущий тестовый код:
import threading def hello(): print "hello, world" t = threading.Timer(5, hello) t.start()
Если я помещаю код потока в цикл, он печатает значения в случайное (быстрое) время.
Ответ №1:
Сработает ли что-то подобное?
import time
import threading
total_time = 5
increment_time = .1
is_running = False
count = 0
def incrementCounter():
global count
global is_running
is_running = True
threading.Timer(increment_time, incrementCounter).start()
count = 1
# Any additional code should be put here
end_time = time.time() total_time
while time.time() < end_time:
if not is_running:
incrementCounter()
print count
Вывод для этого я получаю ~ 50.
Комментарии:
1. Большое спасибо за это, это очень полезно. Однако это недостаточно надежно. При более высокой частоте дискретизации (например, increment_time = .01, 100 Гц) я получаю 325 выборок вместо 500. 🙁 Пока
datetime
что дает наилучшие результаты (до 100 Гц).2. С помощью кода, который вы опубликовали выше, при разнице во времени 5 секунд и 1 секунду с уважением, я получаю вывод 4. При
Timer
этом он будет последовательно выводить 5 с той же конфигурацией. Я не уверенdatetime
, что это очень надежно даже с меньшими интервалами.