Python3.6 как измерить время выполнения - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь создать общий подход к измерению времени выполнения для большинства «сложных» функций.

Для этой цели я ожидал создать декоратор, подобный:

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 'Мы много гуглили, но я не могу найти какого-либо общего подхода к измерению времени выполнения.

Как мы можем измерить время выполнения и предоставить эту информацию в журналы для облегчения исследования / отладки?

...