Medir los gastos generales del decorador
Tu jefe ha escrito un decorador llamado check_everything()
que le parece increíble, y te insiste en que lo utilices en tu función. Sin embargo, te habrás dado cuenta de que cuando lo utilizas para decorar tus funciones, hace que éstas se ejecuten mucho más lentamente. Tienes que convencer a tu jefe de que el decorador está añadiendo demasiado tiempo de procesamiento a tu función. Para ello, vas a medir cuánto tiempo tarda en ejecutarse la función decorada y compararlo con el tiempo que habría tardado en ejecutarse la función no decorada. Este es el decorador en cuestió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
Este ejercicio forma parte del curso
Escribir funciones en Python
Instrucciones de ejercicio
- Llama a la función original en lugar de a la versión decorada utilizando un atributo de la función que la sentencia
wraps()
del decorador de tu jefe añadió a la función decorada.
Ejercicio interactivo práctico
Pruebe este ejercicio completando este código de muestra.
@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))