Измеряйте длительность через perf_counter и печатайте секунды форматом :.3f. Передавайте *args/**kwargs и сохраняйте результат функции.
Декоратор для измерения длительности выполнения функции
Измеряйте длительность через perf_counter и печатайте секунды форматом :.3f. Передавайте *args/**kwargs и сохраняйте результат функции.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработайте декоратор, который измеряет и выводит время работы обёрнутой функции. При каждом её вызове необходимо печатать, сколько времени заняло выполнение, отображая результат в секундах с точностью до миллисекунд. Декоратор должен корректно работать с функциями любого набора параметров.
Ответ
Измеряйте длительность через perf_counter и печатайте секунды форматом :.3f. Передавайте *args/**kwargs и сохраняйте результат функции.
from functools import wraps
from time import perf_counter
def timed(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = perf_counter()
try:
return func(*args, **kwargs)
finally:
print(f'{func.__name__}: {perf_counter() - start:.3f} с')
return wrapper
Три знака после запятой дают отображение до миллисекунд, но не гарантируют такую точность измерения. finally печатает длительность даже при исключении, не подавляя его. Считается прошедшее время, включая ожидания. Для асинхронной функции требуется обёртка с await, чтобы измерялось выполнение, а не создание корутины.