Этот вопрос проверяет умение применить декораторы на практике, а также знание модуля time или time.perf_counter.
Чтобы создать такой декоратор, нужно измерить время начала выполнения функции и время окончания, а затем вычислить разницу. Декоратор должен вернуть обёртку, которая делает измерения, вызывает исходную функцию и выводит время выполнения. Обычно используют time.perf_counter() для наиболее точных измерений. Такой декоратор помогает анализировать производительность функций.
Чтобы логировать время выполнения, нужно:
перед вызовом функции записать текущее время;
вызвать функцию;
записать время окончания;
вывести разницу.
Это классическая задача для декоратора.
Python
import time
from functools import wraps
def timeit(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
duration = time.perf_counter() - start
print(f"{func.__name__} took {duration:.6f} seconds")
return result
return wrapper
Python
@timeit
def slow():
time.sleep(0.2)
slow()
Вывод:
slow took 0.2001 seconds
time.perf_counter() — лучший выбор для измерений производительности.
@wraps(func) сохраняет имя и докстроку функции.
Такой декоратор удобно расширять: логировать в файл, отправлять метрики, накапливать статистику.
профилирование частей кода;
измерение производительности API-методов;
анализ узких мест;
логирование медленных операций (SQL-запросов, внешних API).
Тайминг-декоратор замеряет время до и после вызова функции, выводит разницу и позволяет легко измерять производительность без изменения основной логики.