Decorator ek yükünü ölçme
Patronun, harika olduğunu düşündüğü check_everything() adlı bir decorator yazdı ve fonksiyonunda bunu kullanmanda ısrar ediyor. Ancak, bunu fonksiyonlarını süslemek için kullandığında, onların çok daha yavaş çalıştığını fark ettin. Decorator'ün fonksiyonuna gereğinden fazla işlem süresi eklediğine patronunu ikna etmen gerekiyor. Bunu yapmak için, süslenmiş (decorated) fonksiyonun çalışmasının ne kadar sürdüğünü ölçecek ve süslenmemiş (undecorated) fonksiyonun ne kadar sürede çalışacağıyla karşılaştıracaksın. Söz konusu decorator şu:
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
Bu egzersiz, kursun bir parçasıdır
Python'da Fonksiyon Yazımı
Egzersiz talimatları
- Patronunun decorator'ündeki
wraps()ifadesinin süslenmiş fonksiyona eklediği bir özniteliği kullanarak, süslenmiş sürüm yerine orijinal fonksiyonu çağır.
Uygulamalı etkileşimli egzersiz
Bu egzersizi bu örnek kodu tamamlayarak deneyin.
@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))