Я знаю, что время выполнения любой программы на Python зависит от ОС и не может контролироваться пользователем. Но я хочу, чтобы программа переходила в спящий режим, если время выполнения меньше необходимого.
Допустим, у меня есть программа на Python, в конце которой есть оператор печати.
def foo():
...
...
return(ans)
print(foo())
Используя timeit, я оценил диапазон времени выполнения для foo. Пусть оно будет от 0,8 секунды до 5,5 секунды. Я выбираю время выполнения всего скрипта как 10 секунд, чтобы быть в безопасности.
Я хочу, чтобы программа добавляла задержку в 9,2 секунды перед оператором печати, если выполнение foo было завершено за 0,8 секунды. Аналогично задержка 4,5 секунды, если выполнение было завершено за 5,5 секунды.
@ddejohn не очень, работает разрешение 0,1 секунды.
Вы можете измерить время выполнения foo()
, используя два вызова time.time()
. Затем вы можете вычислить количество времени, необходимое для остановки выполнения программы, используя вычисленное время выполнения foo()
:
import time
def foo():
...
start_time = time.time()
foo()
end_time = time.time()
if end_time - start_time < 10:
time.sleep(10 - (end_time - start_time))
Обратите внимание, что мы используем time.sleep()
, а не цикл while
, который многократно проверяет, прошло ли достаточно времени, начиная с занятое ожидание тратит ресурсы.
Как-то глупо упоминать о «трате ресурсов», когда время — это ресурс, и ОП хочет намеренно потратить его впустую, но ¯\_(ツ)_/¯
хорошо работает в требуемом разрешении. Спасибо! @BrokenBenchmark
@ddejohn Да, но занятое ожидание - это общий образец, которого следует избегать. Я собирался прокомментировать это в вашем ответе, но он был удален до того, как я смог ответить. (Я не был тем, кто проголосовал против, для протокола.)
@ddejohn Однако время - это ресурс, отличный от циклов ЦП. Сон позволяет другому процессу использовать эти циклы.
В основном вам просто нужно спать в течение времени, которое составляет разницу между максимальным временем и фактическим временем выполнения. вы также можете сделать декоратор общего назначения.
class padtime:
def __init__(self, maxtime):
self.maxtime = float(maxtime)
def __call__(self, f):
def _f(*args, **kwargs):
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
delay = self.maxtime - (end - start)
if delay > 0.0:
time.sleep(delay)
return ret
return _f
@padtime(9.5)
def foo():
...
return("Answer")
которые можно применить к любой функции.
Насколько точным вам нужно быть?