Măsurarea costului de performanță al decoratorilor
Șeful tău a scris un decorator numit check_everything(), de care este foarte mândru, și insistă să îl folosești pe funcțiile tale. Ai observat însă că, atunci când îl aplici, funcțiile rulează mult mai lent. Trebuie să îl convingi că decoratorul adaugă prea mult timp de procesare. Pentru asta, vei măsura cât durează execuția funcției decorate și vei compara cu cât ar fi durat fără decorator. Acesta este decoratorul în cauză:
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
Acest exercițiu face parte din cursul
Scrierea funcțiilor în Python
Instrucțiuni pentru exercițiu
- Apelează funcția originală în loc de versiunea decorată, folosind un atribut pe care instrucțiunea
wraps()din decoratorul șefului tău l-a adăugat funcției decorate.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
@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))