Получить время выполнения блока кода в 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
время процессора пользователя и системы не является существенным (хотя я хотел бы измерить их), но за прошедшее время я хотел бы иметь возможность сделать что-то вроде этого, вместо использования сложных команд или модулей.
5 ответов:
чтобы получить интервал времени в секундах, вы можете использовать
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()
, потому что он будет выбрать функцию синхронизации, которая имеет более высокое разрешение для любой платформы.
Я всегда использую декоратор, чтобы сделать некоторую дополнительную работу для существующей функции, в том числе, чтобы получить время выполнения. Это питон и просто.
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()
вы можете добиться этого с помощью контекстного менеджера, например:
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)
я обнаружил, что решаю эту проблему снова и снова, поэтому я, наконец, создал библиотека для него. Установите с помощью
pip install timer_cm
. Затем:from time import sleep 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%)