Важно знать, что декоратор имеет простой эффект:
@decorator
def f():
…
- это просто синтаксический сахар для
def f():
…
f = decorator(f)
Таким образом, если декоратор ничего не делает, выне возникает никаких накладных расходов, когда вызывает декорированную функцию (хотя вызов decorator(f)
занимает немного времени), как в
decorator = lambda func: func
@decorator
def f():
…
Если декоратор что-то делает, вы толькополучите все время, которое требует декоратор.Обычно это включает в себя дополнительный вызов функции (вызов декорированной функции), как в
def decorator(func):
def decorated_func():
print "Before calling function", func # Some overhead (but that's normal)
func() # This will be a second function call, after the call to decorated_func()
return decorated_func
. Таким образом, декорирование функции само по себе не добавляет много накладных расходов на то, что вы хотите сделать: единственные очевидные накладные расходыто, что вы могли бы в принципе удалить, означало бы не вызывать func()
в декорированной функции, а вместо этого копировать полный код, но это ухудшило бы читаемость кода (удобочитаемость и гибкость - вот некоторые причины, по которым декораторы существуют в первую очередь).