Задача на декораторы
Задача звучит так:
Создайте функцию-декоратор time_decorator, которая должна вычислить время выполнения декорированной функции и поместить это значение времени в словарь execution_time, где ключом является имя декорированной функции. Значением является время выполнения этой функции. Например:
@time_decorator
def func_add(a, b):
sleep(0.2)
return a + b
>>> func_add(10, 20)
30
>>> execution_time['func_add']
0.212341254
Мой код:
from typing import Dict
import time
execution_time: Dict[str, float] = {}
def time_decorator(fn):
def wrapper(a, b, sleep_time):
global execution_time
start = time.time()
fn(a, b, sleep_time)
end = time.time()
x = end - start
execution_time = {fn.__name__: x}
return execution_time
return wrapper
@time_decorator
def func_add(a, b, sleep_time):
time.sleep(sleep_time)
print(a + b)
Результат:
sleep_time = 0.1
func_add(10, 20, sleep_time)
print(execution_time['func_add'])
30
0.1009986400604248
Не понимаю, почему время сна в примере задано как sleep(0.2). И в моем коде строка execution_time['func_add'] без функции print не даст никакого результата. Тест выдал следующую ошибку:
Test name: test_f1_time_decorator
Failure message:
def test_f1_time_decorator():
sleep_time = TIME_100MS
> assert 30 == task.time_decorator(func_test1)(10, 20, sleep_time)
E AssertionError: assert 30 == {'func_test1': 0.10023021697998047}
E + where {'func_test1': 0.10023021697998047} = <function time_decorator.<locals>.wrapper at 0x7fa5049536d0>(10, 20, 0.1)
E + where <function time_decorator.<locals>.wrapper at 0x7fa5049536d0> = <function time_decorator at 0x7fa504a10f70>(func_test1)
E + where <function time_decorator at 0x7fa504a10f70> = task.time_decorator
tests/test_task.py:14: AssertionError
Ответы (2 шт):
Автор решения: Максим
→ Ссылка
Я сделал так, вроде сработало:
from typing import Dict
import time
execution_time: Dict[str, float] = {}
def time_decorator(fn):
def wrapper(*args, **kwargs):
global execution_time
time1 = time.time()
result = fn(*args, **kwargs)
time2 = time.time()
time3 = time2 - time1
execution_time[fn.__name__] = time3
return result
return wrapper
Автор решения: Дмитрий
→ Ссылка
Решил не портить код глобальными переменными, а создать функцуию которая будет добавлять наши значения:
import functools
import time
time_dictionary = {}
def adding_to_dictionary(keys, values):
time_dictionary[keys] = values
return time_dictionary
def time_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
end_time = time.time()
elapsed_time = end_time - start_time
return elapsed_time
return wrapper
@time_decorator
def func_add(a: int, b: int):
time.sleep(0.2)
return a + b
print(adding_to_dictionary(func_add.__name__, func_add(5, 5)))