Задача 5A. Простой декоратор

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб

Условие

Требуется реализовать на языке Python функции-декораторы.

Функция time_decorator должна принимать декорируюмую функцию и возвращать функцию выводящую время начала выполнения функции, до выполнения декорируемой функции. После выполнения декорируемой функции должно выводиться время окончания выполнения функции и общее время выполнения в миллисекундах.

      
      def time_decorator (decorated_func):
        pass
      
    
Функция counter_decorator должна принимать декорируюмую функцию и возвращать функцию выводящую количество вызовов декорируемой функции. И выполнять декорируюмую функцию.
      
      def counter_decorator(decorated_func):
        pass
      
    
Функция method_decorator должна принимать метод класса с одним аргументом, и возвращать функцию от 3-х аргументов (x, y, z), и вызывать декорируемый метод от аргумента 3 * x - 7 * y + 15 * z + 18.
      
      def method_decorator(decorated_method):
        pass 
      
    

Формат выходных данных

Код решения должен содержать только определение и реализацию функций.

Примеры тестов

Стандартный вход Стандартный выход
1
@time_decorator
def floyd_warshall (n):
  dp = [[0] * n for i in range(n)]
  for i in range(n):
    for j in range(n):
      if (i == j):
        dp[i][j] = 0
      else:
        dp[i][j] = random.randint(1, n)

  for k in range(n):
    for i in range(n):
      for j in range(n):
        dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])

  sum = 0
  for i in range(n):
    for j in range(n):  
      sum += dp[i][j]

  print(sum)

floyd_warshall(100)
Start time: 1545320524.501671
70943
End time: 1545320524.830567
Execution time: 0.32890844345092773
2
def sum (a, b):
  print(a + b)

fn = counter_decorator(sum)
fn(1, 2)
fn(4, 5)
fn(-4, 5)
Function calls count: 1
3
Function calls count: 2
9
Function calls count: 3
1
3
class do_it:
  def __init__(self):
    pass

  @method_decorator
  def calc(self, x):
    print(x * x)

obj = do_it()
obj.calc(1, 2, 3)
2704

0.060s 0.011s 13