2013-03-29 3 views
52

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

Я знаю модуль 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 

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

ответ

122

Чтобы получить прошедшее время в секундах, вы можете использовать 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(), потому что он будет выбрать функцию синхронизации, которая имеет более высокое разрешение для любой платформы.

+1

Я прочитал, что это не лучший подход для блоков кода, которые занимают всего лишь часть секунды для запуска. Также я думаю, что с использованием модуля времени предпочтительнее использовать метод .clock()? http://stackoverflow.com/questions/85451/python-time-clock-vs-time-time-accuracy – lucacerone

+1

Изменен мой ответ на использование 'timeit.default_timer()', который будет выбирать между 'time.time()' или 'time.clock()' в зависимости от того, какое значение имеет более высокое разрешение на используемой вами платформе. –

+0

спасибо, default_timer() кажется лучше. Советы на этой странице тоже очень приятные! http://www.huyng.com/posts/python-performance-analysis/ – lucacerone

15

Я всегда использую декоратор для выполнения дополнительной работы для существующей функции, в том числе для получения времени выполнения. Это 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() 
+2

Прошу прощения, я до сих пор не знаю, как использовать декораторы :( – lucacerone

+4

@LucaCerone есть отличное объяснение об украшении http: // stackoverflow ,com/вопросы/739654/decor-python-decorators. Постарайтесь прочитать это терпеливо, и вы поймете декоратора. – Yarkee

+0

спасибо, это действительно интересный пост! – lucacerone

7

Вы можете добиться этого с помощью контекстного менеджера, например:

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) 
+0

В последней строке это должно быть 'префикс', а не' item_name'. –

+0

@GeorgePetrov Спасибо, я исправил его. – monklof

6

я обнаружил, что решить эту проблему снова и снова, так что я, наконец, создал a library для этого. Установите с 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%) 
+0

, казалось бы, актуальный вопрос, который я поднял: https://stackoverflow.com/questions/48260833/make-a-child-of-a-timer-cm-timer-object-in-a-called-function – lurix66

+0

Отлично работает, кроме опечатка («таймер импорта» ---> «Таймер импорта») и отсутствующий пакет ('время импорта') – user3768495

+0

Sheesh. Ты прав. Я исправил свой ответ. –

0

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

%time <expression> - получить прямую загрузку процессора и стены времени на экспрессию

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