Mengukur overhead dekorator
Atasan Anda menulis sebuah dekorator bernama check_everything() yang menurutnya luar biasa, dan ia bersikeras agar Anda menggunakannya pada fungsi Anda. Namun, Anda menyadari bahwa ketika Anda menggunakannya untuk mendekorasi fungsi Anda, fungsi tersebut berjalan jauh lebih lambat. Anda perlu meyakinkan atasan bahwa dekorator tersebut menambah waktu pemrosesan yang terlalu besar pada fungsi Anda. Untuk itu, Anda akan mengukur berapa lama fungsi yang didekorasi berjalan dan membandingkannya dengan berapa lama fungsi tanpa dekorasi akan berjalan. Berikut dekorator yang dimaksud:
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
Latihan ini adalah bagian dari kursus
Menulis Function di Python
Petunjuk latihan
- Panggil fungsi asli alih-alih versi yang didekorasi dengan menggunakan sebuah atribut dari fungsi yang ditambahkan oleh pernyataan
wraps()dalam dekorator atasan Anda ke fungsi yang didekorasi.
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
@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))