Mierzenie narzutu dekoratora
Twój szef napisał dekorator o nazwie check_everything(), który uważa za coś wyjątkowego – i nalega, żebyś go używał w swojej funkcji. Zauważyłeś jednak, że dekorowanie funkcji tym dekoratorem sprawia, iż działają one znacznie wolniej. Musisz przekonać szefa, że dekorator dodaje zbyt dużo czasu przetwarzania. W tym celu zmierzysz, jak długo trwa wykonanie wersji udekorowanej, i porównasz to z czasem wykonania wersji bez dekoratora. Oto dekorator, o którym mowa:
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
To ćwiczenie jest częścią kursu
Pisanie funkcji w Pythonie
Instrukcje do ćwiczenia
- Zamiast wywoływać wersję udekorowaną, wywołaj oryginalną funkcję – skorzystaj z atrybutu, który instrukcja
wraps()w dekoratorze szefa dodała do udekorowanej funkcji.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
@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))