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