Агрегирование времени выполнения кода в Python

В Python существует множество способов узнать, сколько времени занимает функция. Вот простая реализация декоратора для проверки того, сколько времени занимает функция.

from functools import wraps
import time


def timeit(func):
    @wraps(func)
    def timeit_wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        total_time = end_time - start_time
        print(f'Function {func.__name__}{args} {kwargs} took {total_time:.4f} seconds')
        return result
    return timeit_wrapper

@timeit
def my_func():
    # do stuff

Войти в полноэкранный режим Выйти из полноэкранного режима

Этот декоратор можно использовать, украшая функцию, чтобы получить затраченное время.
Что если вы хотите агрегировать эти данные по времени во временном интервале, например, сколько раз была вызвана эта функция, и какое максимальное время было затрачено, для этого нам нужно использовать библиотеку под названием codetiming.
Вот пример использования:

# pip install codetiming
# pip install humanfriendly
from codetiming import Timer
from humanfriendly import format_timespan
from loguru import logger


@Timer(name="my_func", text=lambda secs: f"my_func elapsed time: {format_timespan(secs)}")
def my_func():
    ...

def get_aggregated_timings(cls):
    timed_function = "my_func"
    logger.info(
        f"n{timed_function} count: {Timer.timers.count(timed_function)}n"
        f"total: {Timer.timers.total(timed_function)}n"
        f"max: {Timer.timers.max(timed_function)}n"
        f"min: {Timer.timers.min(timed_function)}n"
        f"mean: {Timer.timers.mean(timed_function)}n"
        f"standard deviation: {Timer.timers.stdev(timed_function)}n"
        f"median: {Timer.timers.median(timed_function)}n"
    )
    Timer.timers.clear()  # clears all the timer data

Вход в полноэкранный режим Выход из полноэкранного режима

Это позволит найти суммарное время, затраченное my_func. Давайте пройдемся по тому, что каждый из них будет записывать в журнал:

  • count: Количество раз, когда функция была вызвана.
  • total: Сумма всех секунд, затраченных на выполнение функции.
  • max: Максимальное время, затраченное на один поток
  • min: Минимальное время, затраченное на один поток
  • mean: Среднее значение всех затрат времени на данную функцию
  • медиана: Медиана всего прошедшего времени
  • stdev: Стандартное отклонение всего прошедшего времени.

В конце Timer.timers.clear() очищает данные, хранящиеся в памяти, и начинает все с чистого листа для следующей итерации.

Если вы хотите использовать LRU-кэш в памяти с таймаутом, вы можете ознакомиться с этой статьей:

Функции кэша с таймаутом

Я пишу о программировании на Python в своем Twitter, вы можете следить за мной @soumendrak_.

Originally posted at: мой блог

Оцените статью
devanswers.ru
Добавить комментарий