← Все вопросы

Что такое декоратор простыми словами и как замерить им время выполнения функции?

Задан 3 месяца назад724 просмотров2 ответа
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). Внутри обёртки запоминаешь время до и после вызова.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект