Подтвердить что ты не робот

Получить время выполнения блока кода в Python 2.7

Я хотел бы измерить время, прошедшее с целью оценки блока кода в программе Python, возможно разделение между временем процессора пользователя, временем системного процессора и прошедшим временем.

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

Я бы предпочел что-то, что можно было бы использовать как:

#up to here I have done something....
start_counting() #or whatever command used to mark that I want to measure
                   #the time elapsed in the next rows
# code I want to evaluate
user,system,elapsed = stop_counting() #or whatever command says:
                                      #stop the timer and return the times

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

4b9b3361

Ответ 1

Чтобы получить прошедшее время в секундах, вы можете использовать timeit.default_timer():

import timeit
start_time = timeit.default_timer()
# code you want to evaluate
elapsed = timeit.default_timer() - start_time

timeit.default_timer() используется вместо time.time() или time.clock(), потому что он выберет функцию синхронизации, которая имеет более высокое разрешение для любой платформы.

Ответ 2

Я всегда использую декоратор для выполнения дополнительной работы для существующей функции, в том числе для получения времени выполнения. Это pythonic и просто.

import time

def time_usage(func):
    def wrapper(*args, **kwargs):
        beg_ts = time.time()
        retval = func(*args, **kwargs)
        end_ts = time.time()
        print("elapsed time: %f" % (end_ts - beg_ts))
        return retval
    return wrapper

@time_usage
def test():
    for i in xrange(0, 10000):
        pass

if __name__ == "__main__":
    test()

Ответ 3

Вы можете достичь этого через Контекстный менеджер, например:

from contextlib import contextmanager
import time
import logging
@contextmanager
def _log_time_usage(prefix=""):
    '''log the time usage in a code block
    prefix: the prefix text to show
    '''
    start = time.time()
    try:
        yield
    finally:
        end = time.time()
        elapsed_seconds = float("%.2f" % (end - start))
        logging.debug('%s: elapsed seconds: %s', prefix, elapsed_seconds)

используйте пример:

with _log_time_usage("sleep 1: "):
    time.sleep(1)

Ответ 4

Я решил решить эту проблему снова и снова, поэтому я, наконец, создал library для нее. Установите с помощью pip install timer_cm. Тогда:

from timer_cm import timer

with Timer('Long task') as timer:
    with timer.child('First step'):
        sleep(1)
    for _ in range(5):
        with timer.child('Baby steps'):
            sleep(.5)

Вывод:

Long task: 3.520s
  Baby steps: 2.518s (71%)
  First step: 1.001s (28%)

Ответ 5

Есть еще один вариант, который я очень люблю сейчас для простоты - ipython. В ipython у вас много полезного материала плюс:

%time <expression> - чтобы получить прямое cpu и время стены на выражение

%timeit <expression> - получить cpu и время стены в цикле выражения