Оберните вызов функции измерением perf_counter() до и после, сохранив результат и метаданные через wraps. finally позволяет вывести длительность даже при исключении.
Декоратор для измерения времени работы функции
Оберните вызов функции измерением perf_counter() до и после, сохранив результат и метаданные через wraps. finally позволяет вывести длительность даже при исключении.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте декоратор, который будет измерять длительность выполнения оборачиваемой функции и выводить полученное время на экран.
Ответ
Оберните вызов функции измерением perf_counter() до и после, сохранив результат и метаданные через wraps. finally позволяет вывести длительность даже при исключении.
Пример для синхронной функции:
from functools import wraps
from time import perf_counter
def measure_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
started = perf_counter()
try:
return func(*args, **kwargs)
finally:
elapsed = perf_counter() - started
print(f'{func.__name__}: {elapsed:.6f} s')
return wrapper
Это wall-clock длительность, включающая ожидание. Для async-функции обёртка должна быть async def и ожидать await func(...), иначе измерится лишь создание coroutine. В приложении вместо print обычно используют настроенный логгер или метрику.