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
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))