Я пытаюсь создать общий подход к измерению времени выполнения для большинства «сложных» функций.
Для этой цели я ожидал создать декоратор, подобный:
def timeit(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
logger.info(f"Execution time for {func.__name__} is {time.time() - start} seconds")
return result
return wrapper
@timeit
async def some_func():
# Function body
Основная проблема здесь - это синхронный код, который не так хорош.
Я также пытался сделать что-то похожее на:
def timeit():
def wrapper(func):
@wraps(func)
async def wrapped(*args, **kwargs):
start = time.time()
logger.info(f"Starting {func.__name__}...")
return await func(*args)
end = time.time() - start
logger.info(f"Completed {func.__name__} in {} seconds")
return wrapped
return wrapper
Здесь есть несколько проблем:
1) start
время это не совсем время начала, но время, когда функция была добавлена в асинхронный цикл
2) Я не получу информацию о завершении моегофункция из-за оператора return
.
Чтобы избежать этого пункта, я мог бы попытаться использовать run_until_complete
, но я не уверен, что это нормально для таких декораторов.
I 'Мы много гуглили, но я не могу найти какого-либо общего подхода к измерению времени выполнения.
Как мы можем измерить время выполнения и предоставить эту информацию в журналы для облегчения исследования / отладки?