Найти - Пользователи
Полная версия: Точность задержки в Python
Начало » Python для экспертов » Точность задержки в Python
1
sinopteek
Необходимо реализовать задержку в 20 мкс в нескольких местах по ходу программы.
Раскидал 6 вызовов:
time.sleep(delay_ADC)
предварительно задав:
delay_ADC = 20 * 10**-6
должно было получиться 12 кратное замедление работы программы, но в результате скорость работы практически не изменилась(в пределах погрешности)

тогда для проверки работы time.delay был написан след код
import cProfile
import time

def SLEEP(num):
for i in range(num):
time.sleep(20*10**-6)

cProfile.run('SLEEP(1000000)')
на выходе имеем:

1000004 function calls in 1.164 CPU seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.163 1.163 <string>:1(<module>)
1 0.520 0.520 1.163 1.163 test.py:11(SLEEP)
1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects}
1 0.021 0.021 0.021 0.021 {range}
1000000 0.622 0.000 0.622 0.000 {time.sleep},
хотя должно было быть 20 секунд(миллион раз по 20 мкс)

профилировании конструкции cProfile.run('time.sleep(2)') выдаёт 2.005 CPU seconds, как в принципе и должно быть,
отсюда делаю вывод, что time.sleep() имеет ограничение на размер задержки. Каким образом мне получить задержку в микросекундах,
хотя бы примерно?
sinopteek
Пока решил задачу следующим способом
import time

def bit_delay(secs):
if secs > 0.:
start = time.clock()
while (time.clock() - start) < secs:
pass
#print 'out',time.clock() - start
последняя строка позволяет примерно определить время выхода из цикла
Rodegast
У time.sleep() большая погрешность поэтому с её помощью нельзя устанавливать маленькие задержки.
Андрей Светлов
sleep попутно переключает поток - и добавляется неопределенность.
На винде time.close сделана через QueryPerformanceTimer - поэтому довольно точная, time.time хуже.
На линуксе - наоборот. time.time работает через gettimeofday
kelseyradley
Поскольку time.sleep() имеет большую мощность, его нельзя использовать для установления небольших задержек. 
Retro Bowl College 
ZerG
попробуй свой тормозистор заюзать

 def tormositor(ms: int) -> None:
    start_time = time.time() * 1000  # Convert to milliseconds
    target_time = start_time + ms
    while time.time() * 1000 < target_time:
        pass

В целом же видно что ты вяжешь что-то с МК - так что было бы логичнее там организовать делитель и каунтер и просто по сигналу плевать в питон данные
Так как засинхронить время на ПК и камня - весьма сложно
jeffreestar
Ваш вывод верен. time.sleep() действительно не предназначен для точного управления микросекундными задержками в Python из-за ограничений операционной системы и различий в реализации интерпретатора. Для более точного контроля временных задержек на микросекундном уровне можно использовать модуль timeit или сторонние библиотеки, такие как pygame, pyserial или RPi.GPIO (для работы с GPIO на Raspberry Pi), в зависимости от ваших потребностей и платформы.
fnaf
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB