Đo chi phí phụ trội của decorator
Sếp của bạn đã viết một decorator tên là check_everything() mà họ nghĩ là tuyệt vời và yêu cầu bạn dùng nó cho hàm của mình. Tuy nhiên, bạn nhận thấy khi dùng decorator này, các hàm chạy chậm đi rất nhiều. Bạn cần thuyết phục sếp rằng decorator đang thêm quá nhiều thời gian xử lý vào hàm. Để làm điều đó, bạn sẽ đo thời gian chạy của hàm đã được trang trí và so sánh với thời gian mà hàm chưa trang trí sẽ mất. Đây là decorator đang được nói đến:
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
Bài tập này là một phần của khóa học
Viết hàm trong Python
Hướng dẫn bài tập
- Gọi hàm gốc thay vì phiên bản đã được trang trí bằng cách sử dụng một thuộc tính của hàm mà câu lệnh
wraps()trong decorator của sếp bạn đã thêm vào hàm đã được trang trí.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
@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))