В 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: мой блог