← Все вопросы
Что такое декоратор простыми словами и как замерить им время выполнения функции?
14
Постоянно встречаю @что-то над функциями и слово «декоратор», но не понимаю сути. Можете объяснить простыми словами и показать рабочий пример декоратора, который замеряет, сколько функция выполнялась?
2 ответа
24
✓ Принятый ответ — помог автору
Декоратор — это функция, которая берёт другую функцию и возвращает её «обёрнутую» версию с дополнительным поведением. Запись @timer над функцией — просто сахар для f = timer(f).
import time
from functools import wraps
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
print(f"{func.__name__}: {time.perf_counter() - start:.4f} с")
return result
return wrapper
@timer
def slow():
time.sleep(0.5)
return 42
slow() # slow: 0.5001 с
Ключевое: wrapper принимает *args, **kwargs, чтобы подходить к любой функции, и обязательно возвращает result, иначе декорированная функция начнёт отдавать None. @wraps сохраняет имя и docstring исходной функции.
alex zali Можно для замера ещё time.monotonic, но perf_counter точнее · 2 месяца назад
Татьяна Петрова @wraps часто забывают, и потом f.__name__ показывает 'wrapper' — спасибо, что добавил · 2 месяца назад
6
Это обёртка над функцией. @timer == func = timer(func). Внутри обёртки запоминаешь время до и после вызова.
Ваш ответ
Войдите, чтобы ответить на вопрос.