ComeçarComece gratuitamente

Medição da sobrecarga do decorador

Seu chefe escreveu um decorador chamado check_everything() que ele acha incrível e está insistindo para que você o use em sua função. No entanto, você notou que, quando o usa para decorar suas funções, ele as torna muito mais lentas. Você precisa convencer seu chefe de que o decorador está adicionando muito tempo de processamento à sua função. Para isso, você medirá o tempo que a função decorada leva para ser executada e comparará com o tempo que a função não decorada levaria para ser executada. Esse é o decorador em questão:

def check_everything(func):

  @wraps(func)

  def wrapper(*args, **kwargs):

    check_inputs(*args, **kwargs)

    result = func(*args, **kwargs)

    check_outputs(result)

    return result

  return wrapper

Este exercício faz parte do curso

Como escrever funções em Python

Ver Curso

Instruções de exercício

  • Chame a função original em vez da versão decorada usando um atributo da função que a instrução wraps() no decorador do seu chefe adicionou à função decorada.

Exercício interativo prático

Experimente este exercício preenchendo este código de exemplo.

@check_everything
def duplicate(my_list):
  """Return a new list that repeats the input twice"""
  return my_list + my_list

t_start = time.time()
duplicated_list = duplicate(list(range(50)))
t_end = time.time()
decorated_time = t_end - t_start

t_start = time.time()
# Call the original function instead of the decorated one
duplicated_list = duplicate.____(list(range(50)))
t_end = time.time()
undecorated_time = t_end - t_start

print('Decorated time: {:.5f}s'.format(decorated_time))
print('Undecorated time: {:.5f}s'.format(undecorated_time))
Editar e executar código