IniziaInizia gratis

Misurare l’overhead dei decorator

Il tuo capo ha scritto un decorator chiamato check_everything() che ritiene straordinario, e insiste perché tu lo usi nella tua funzione. Tuttavia, hai notato che quando lo usi per decorare le tue funzioni, le rende molto più lente. Devi convincere il tuo capo che il decorator aggiunge troppo tempo di elaborazione alla tua funzione. Per farlo, misurerai quanto impiega a eseguire la funzione decorata e lo confronterai con quanto avrebbe impiegato la funzione non decorata. Ecco il decorator in questione:

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

Questo esercizio fa parte del corso

Scrivere funzioni in Python

Visualizza il corso

Istruzioni dell'esercizio

  • Chiama la funzione originale invece della versione decorata usando un attributo della funzione che l’istruzione wraps() nel decorator del tuo capo ha aggiunto alla funzione decorata.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

@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))
Modifica ed esegui il codice