MiddleКодИногдаЕщё не отвечали
Напишите декоратор, измеряющий время функции
Реализуйте timed — декоратор, печатающий, сколько длился обёрнутый вызов.
Требования:
- Пробросить произвольные
*args/**kwargsв обёрнутую функцию и вернуть её результат. - Сохранить имя и docstring обёрнутой функции.
import functools, time
def timed(func):
# ваш код здесь
@timed
def slow():
time.sleep(0.1)
Допишите реализацию.
Верните замыкание, которое записывает time.perf_counter() до и после вызова, пробрасывает *args, **kwargs и возвращает результат. Примените @functools.wraps(func) к обёртке, чтобы она сохранила исходные имя и docstring — без wraps декорированная функция теряет эти метаданные.
- ✗Возвращать прошедшее время вместо результата функции
- ✗Опускать
*args/**kwargs, из-за чего обёртка не пробрасывает аргументы - ✗Пропускать
functools.wraps, теряя имя и docstring функции
- →Что именно
functools.wrapsкопирует на обёртку? - →Как изменится декоратор, если он должен принимать собственный аргумент, например метку?
Оглавление
Задача
Реализуйте декоратор timed, печатающий длительность вызова, пробрасывающий аргументы и сохраняющий метаданные функции.
Решение
import functools, time
def timed(func):
@functools.wraps(func) # сохраняет имя/docstring
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
print(f"{func.__name__} took {time.perf_counter() - start:.4f}s")
return result
return wrapper
@timed
def slow():
time.sleep(0.1)
Ключевые моменты
wrapper(*args, **kwargs)пробрасывает любые аргументы и возвращает реальный результат функции.functools.wrapsкопирует__name__,__doc__и др. — иначе они становятсяwrapper.time.perf_counter— монотонные часы высокого разрешения, лучшеtime.timeдля замеров.
Оглавление