Декоратор для метода timeit.timeit?

Я пытаюсь написать простой декоратор времени для измерения времени, затрачиваемого функциями. Однако приведенный ниже код дает нашу ошибку рекурсии. Что с этим не так?

import timeit

def measure(func):
    def wrapper():
        func_name = func.__name__
        setup="from __main__ import {}".format(func_name)
        op_time = timeit.timeit('{}()'.format(func_name), number = 2, setup=setup)
        print(ot)
    return wrapper

@measure
def sample():
    return 10

sample()

Выход

RecursionError                            Traceback (most recent call last)
<ipython-input-61-e079e1bd7fba> in <module>()
     15     return 10
     16
---> 17 sample()

<ipython-input-61-e079e1bd7fba> in wrapper()
      7         func_name = func.__name__
      8         setup="from __main__ import {}".format(func_name)
----> 9         op_time = timeit.timeit('{}()'.format(func_name), number = 2, setup=setup)
     10         print(ot)
     11     return wrapper

~/anaconda3/lib/python3.6/timeit.py in timeit(stmt, setup, timer, number, globals)
    231            number=default_number, globals=None):
    232     """Convenience function to create Timer object and call timeit method."""
--> 233     return Timer(stmt, setup, timer, globals).timeit(number)
    234
    235 def repeat(stmt="pass", setup="pass", timer=default_timer,

~/anaconda3/lib/python3.6/timeit.py in timeit(self, number)
    176         gc.disable()
    177         try:
--> 178             timing = self.inner(it, self.timer)
    179         finally:
    180             if gcold:

~/anaconda3/lib/python3.6/timeit.py in inner(_it, _timer)

... last 4 frames repeated, from the frame below ...

<ipython-input-61-e079e1bd7fba> in wrapper()
      7         func_name = func.__name__
      8         setup="from __main__ import {}".format(func_name)
----> 9         op_time = timeit.timeit('{}()'.format(func_name), number = 2, setup=setup)
     10         print(ot)
     11     return wrapper

RecursionError: maximum recursion depth exceeded while calling a Python object

Мне интересно узнать, что не так с моим существующим кодом, пожалуйста, не публикуйте альтернативные решения.


person Uchiha Madara    schedule 24.07.2018    source источник
comment
У вас не может быть самого времени функции, как это, потому что то, как вы рассчитываете, запускает функцию, которая умножает функцию, которая запускает функцию ...   -  person MoxieBall    schedule 24.07.2018