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
Python'da Fonksiyon Yazımı
kursunun bir parçasıdırEgzersiz 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ı interaktif egzersiz
Bu örnek kodu tamamlayarak bu egzersizi bitirin.
@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))