Создание таймера, который сообщает мне, сколько времени прошло с момента последнего прохождения функции

#python #timeit

Вопрос:

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

Комментарии:

1. Возможно, это не совсем то, что вам нужно, но я бы предложил добавить распределенную трассировку в код вместо того, чтобы засорять его кодом таймера

2. Это немного похоже на использование кувалды, чтобы расколоть орех, поскольку время между двумя исполнениями кода-это действительно единственное, что мне нужно.

3. Возможно, но как вы гарантируете, что эта функция когда-нибудь будет вызвана снова? Расчет времени между вызовами может быть рассчитан только на основе времени, когда он был вызван

4. Я думаю, мне придется попробовать это.

Ответ №1:

Вы можете сделать следующее: создайте декоратор, сохраните в /tmp/ файле последнюю метку времени, когда функция была вызвана. И каждый раз, когда вызывается функция, проверяйте значение в этом файле и сравнивайте его с текущей меткой времени.

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

 import time
import os


def mytimeit(func):
    timerfile = os.path.join("/tmp", func.__name__)

    def timed(*args, **kwargs):
        # Read content of storing file
        # The file name in our case is /tmp/foo
        lasttime = None
        try:
            with open(timerfile, "r") as f:
                lasttime = "n".join([f.readlines()[0]]).strip()
                lasttime = float(lasttime)
        except Exception as e:
            # The file does not exist: the function has never been called
            print("First time calling foo")
            pass
    
        now = time.time()
        if lasttime is not None:
            print("Last time {} was called was {} seconds ago".format(func.__name__, now - lasttime))

        # Let's save the new timestamp that will be used to know
        # when is the last time the function was called
        with open(timerfile, "w") as f:
            f.write(str(now))

        # Call the decorated function (in our case, "foo")
        result = func(*args, **kwargs)
        return result
    
    return timed


@mytimeit
def foo():
    print("Calling foo")


if __name__ == "__main__":
    foo()
    time.sleep(2)
    foo()
    time.sleep(5)
    foo()
    time.sleep(1)
    foo()
 

Это дает следующий результат:

 First time calling foo
Calling foo
Last time foo was called was 2.002573013305664 seconds ago
Calling foo
Last time foo was called was 5.007807493209839 seconds ago
Calling foo
Last time foo was called was 1.0037212371826172 seconds ago
Calling foo