डेकोरेटर ओवरहेड मापना
आपके बॉस ने check_everything() नाम का एक डेकोरेटर लिखा है जिसे वे कमाल का मानते हैं, और वे इस पर ज़ोर दे रहे हैं कि आप इसे अपने फंक्शन पर लगाएँ. हालाँकि, आपने देखा है कि जब आप अपनी फंक्शनों को इससे डेकोरेट करते हैं, तो वे बहुत धीमे चलने लगते हैं. आपको अपने बॉस को यह समझाना है कि यह डेकोरेटर आपकी फंक्शन में बहुत ज्यादा प्रोसेसिंग समय जोड़ रहा है. इसके लिए, आप मापेंगे कि डेकोरेटेड फंक्शन को चलने में कितना समय लगता है और उसकी तुलना बिना डेकोरेट किए गए फंक्शन के अनुमानित समय से करेंगे. संबंधित डेकोरेटर यह है:
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
यह अभ्यास पाठ्यक्रम का हिस्सा है
Python में Functions लिखना
अभ्यास निर्देश
- अपने बॉस के डेकोरेटर में
wraps()स्टेटमेंट द्वारा डेकोरेटेड फंक्शन में जोड़े गए attribute का उपयोग करके, डेकोरेटेड वर्ज़न की जगह मूल फंक्शन को कॉल करें.
इंटरैक्टिव व्यावहारिक अभ्यास
इस अभ्यास को इस नमूना कोड को पूरा करके आज़माएँ।
@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))