衡量装饰器的额外开销
您的主管写了一个名为 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 函数编写
练习说明
- 通过调用原始函数而非装饰后的版本来完成比较。使用您主管的装饰器中
wraps()语句为被装饰函数添加的属性来访问原始函数。
交互式实操练习
通过完成这段示例代码来试试这个练习。
@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))