Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2009 13:41:06

sinopteek
От:
Зарегистрирован: 2009-09-28
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Точность задержки в Python

Необходимо реализовать задержку в 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() имеет ограничение на размер задержки. Каким образом мне получить задержку в микросекундах,
хотя бы примерно?



Офлайн

#2 Окт. 26, 2009 15:14:43

sinopteek
От:
Зарегистрирован: 2009-09-28
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Точность задержки в Python

Пока решил задачу следующим способом

import time

def bit_delay(secs):
if secs > 0.:
start = time.clock()
while (time.clock() - start) < secs:
pass
#print 'out',time.clock() - start
последняя строка позволяет примерно определить время выхода из цикла



Офлайн

#3 Окт. 26, 2009 15:19:51

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2739
Репутация: +  183  -
Профиль   Отправить e-mail  

Точность задержки в Python

У time.sleep() большая погрешность поэтому с её помощью нельзя устанавливать маленькие задержки.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Окт. 26, 2009 16:46:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Точность задержки в Python

sleep попутно переключает поток - и добавляется неопределенность.
На винде time.close сделана через QueryPerformanceTimer - поэтому довольно точная, time.time хуже.
На линуксе - наоборот. time.time работает через gettimeofday



Отредактировано (Окт. 26, 2009 16:53:17)

Офлайн

#5 Окт. 27, 2023 12:04:50

kelseyradley
Зарегистрирован: 2023-08-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Точность задержки в Python

Поскольку time.sleep() имеет большую мощность, его нельзя использовать для установления небольших задержек. 
Retro Bowl College 

Офлайн

#6 Окт. 27, 2023 14:53:43

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Точность задержки в Python

попробуй свой тормозистор заюзать

 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

В целом же видно что ты вяжешь что-то с МК - так что было бы логичнее там организовать делитель и каунтер и просто по сигналу плевать в питон данные
Так как засинхронить время на ПК и камня - весьма сложно



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Отредактировано ZerG (Окт. 27, 2023 14:55:27)

Офлайн

#7 Апрель 4, 2024 05:05:34

jeffreestar
Зарегистрирован: 2024-04-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Точность задержки в Python

Ваш вывод верен. time.sleep() действительно не предназначен для точного управления микросекундными задержками в Python из-за ограничений операционной системы и различий в реализации интерпретатора. Для более точного контроля временных задержек на микросекундном уровне можно использовать модуль timeit или сторонние библиотеки, такие как pygame, pyserial или RPi.GPIO (для работы с GPIO на Raspberry Pi), в зависимости от ваших потребностей и платформы.
fnaf

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version