Как получить время выполнения программы на Python? - PullRequest
742 голосов
/ 13 октября 2009

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

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

Ответы [ 27 ]

1302 голосов
/ 13 октября 2009

Самый простой способ в Python:

import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))

Предполагается, что запуск вашей программы занимает не менее одной десятой секунды.

Печать:

--- 0.764891862869 seconds ---
186 голосов
/ 13 октября 2009

Я поместил этот timing.py модуль в свою собственную директорию site-packages и просто вставил import timing вверху моего модуля:

import atexit
from time import clock

def secondsToStr(t):
    return "%d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

line = "="*40
def log(s, elapsed=None):
    print line
    print secondsToStr(clock()), '-', s
    if elapsed:
        print "Elapsed time:", elapsed
    print line
    print

def endlog():
    end = clock()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

def now():
    return secondsToStr(clock())

start = clock()
atexit.register(endlog)
log("Start Program")

Я также могу позвонить timing.log из моей программы, если в программе есть важные этапы, которые я хочу показать. Но только включение import timing напечатает время начала и окончания, а также общее прошедшее время. (Простите мою неясную функцию secondsToStr, она просто форматирует число с плавающей точкой в ​​чч: мм: сс.ссс.)

Примечание: версию вышеприведенного кода на Python 3 можно найти здесь или здесь .

142 голосов
/ 13 октября 2009

В Linux или UNIX:

time python yourprogram.py

В Windows смотрите обсуждение Stackoverflow: Как измерить время выполнения команды в командной строке Windows?

57 голосов
/ 10 сентября 2012

Мне очень нравится ответ Пола Макгуайра, но я использую Python3. Так что для тех, кто заинтересован: вот модификация его ответа, которая работает с Python 3 на * nix (я думаю, в Windows, что clock () должна использоваться вместо time ()):

#python3
import atexit
from time import time, strftime, localtime
from datetime import timedelta

def secondsToStr(elapsed=None):
    if elapsed is None:
        return strftime("%Y-%m-%d %H:%M:%S", localtime())
    else:
        return str(timedelta(seconds=elapsed))

def log(s, elapsed=None):
    line = "="*40
    print(line)
    print(secondsToStr(), '-', s)
    if elapsed:
        print("Elapsed time:", elapsed)
    print(line)
    print()

def endlog():
    end = time()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

start = time()
atexit.register(endlog)
log("Start Program")

Если вы сочтете это полезным, вы все равно должны проголосовать за этот ответ вместо него, поскольку он проделал большую часть работы;).

57 голосов
/ 13 октября 2009
import time

start_time = time.clock()
main()
print time.clock() - start_time, "seconds"

time.clock() возвращает время процессора, что позволяет нам рассчитывать только время, используемое этим процессом (в любом случае в Unix). Документация гласит: «В любом случае, эту функцию следует использовать для тестирования Python или алгоритмов синхронизации»

45 голосов
/ 02 января 2014

Вы можете использовать Python Profiler cProfile для измерения Процессорного времени и, кроме того, сколько времени тратится внутри каждой функции и сколько раз вызывается каждая функция. Это очень полезно, если вы хотите улучшить производительность вашего скрипта, не зная, с чего начать. Этот ответ на другой вопрос ТАК довольно хорош. Всегда приятно взглянуть на документы .

Вот пример того, как профилировать скрипт с помощью cProfile из командной строки:

$ python -m cProfile euler048.py

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}
35 голосов
/ 29 сентября 2014

Мне нравится вывод, предоставляемый модулем datetime, когда объекты дельты времени показывают дни, часы, минуты и т. Д., Если необходимо, понятным для человека способом.

Например:

from datetime import datetime
start_time = datetime.now()
# do your work here
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))

Пример вывода, например

Duration: 0:00:08.309267

или

Duration: 1 day, 1:51:24.269711

Обновление: Как упоминал Дж. Ф. Себастьян, этот подход может столкнуться с некоторыми сложными случаями с местным временем, поэтому его безопаснее использовать:

import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))
24 голосов
/ 13 октября 2009

Еще лучше для Linux: /usr/bin/time

$ /usr/bin/time -v python rhtest2.py

    Command being timed: "python rhtest2.py"
    User time (seconds): 4.13
    System time (seconds): 0.07
    Percent of CPU this job got: 91%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 0
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 15
    Minor (reclaiming a frame) page faults: 5095
    Voluntary context switches: 27
    Involuntary context switches: 279
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Обычно просто time представляет собой более простую встроенную оболочку, которая затеняет более способных /usr/bin/time.

13 голосов
/ 13 октября 2009

Решение rogeriopvl работает отлично, но если вам нужна более конкретная информация, вы можете использовать встроенный профилировщик Python. Проверьте эту страницу:

http://docs.python.org/library/profile.html

профилировщик сообщает вам много полезной информации, например, время, потраченное на каждую функцию

11 голосов
/ 02 июля 2016

В следующем фрагменте напечатано прошедшее время в удобном для человека формате <HH:MM:SS>.

import time
from datetime import timedelta

start_time = time.time()

#
# Perform lots of computations.
#

elapsed_time_secs = time.time() - start_time

msg = "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs))

print(msg)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...