Как мне получить время выполнения программы Python?

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

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

20 Solutions collect form web for “Как мне получить время выполнения программы Python?”

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

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

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

Печать:

 --- 0.764891862869 seconds --- 

Я поместил этот модуль 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 , она просто форматирует число с плавающей запятой секунд до hh: mm: ss.sss form.)

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

В Linux или UNIX:

 time python yourprogram.py 

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

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

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

Вы можете использовать профайлер python cProfile для измерения времени процессора и, кроме того, сколько времени тратится внутри каждой функции и сколько раз каждую функцию вызывается. Это очень полезно, если вы хотите повысить производительность своего скрипта, не зная, с чего начать. Этот ответ на другой вопрос SO довольно хорош. Всегда хорошо смотреть в документах .

Вот пример того, как профилировать скрипт с помощью 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} 

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

 #python3 import atexit from time import time from datetime import timedelta def secondsToStr(t): return str(timedelta(seconds=t)) line = "="*40 def log(s, elapsed=None): print(line) print(secondsToStr(time()), '-', s) if elapsed: print("Elapsed time:", elapsed) print(line) print() def endlog(): end = time() elapsed = end-start log("End Program", secondsToStr(elapsed)) def now(): return secondsToStr(time()) start = time() atexit.register(endlog) log("Start Program") 

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

Мне нравится вывод, предоставляемый модулем 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)) 

Еще лучше для 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 .

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

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

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

 from time import time start_time = time() ... end_time = time() time_taken = end_time - start_time # time_taken is in seconds hours, rest = divmod(time_taken,3600) minutes, seconds = divmod(rest, 60) 

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

 $ python -mtimeit -n1 -r1 -t -s "from your_module import main" "main()" 

Он запускает your_module.main() один раз и печатает прошедшее время с использованием функции time.time() в качестве таймера.

Эмулировать /usr/bin/time в Python см. Подпроцесс Python с / usr / bin / time: как фиксировать информацию о времени, но игнорировать все остальные данные? ,

Чтобы измерить время процессора (например, не включать время во время time.sleep() ) для каждой функции, вы можете использовать модуль profile ( cProfile на Python 2):

 $ python3 -mprofile your_module.py 

Вы можете передать команду -p to timeit выше, если вы хотите использовать тот же таймер, что и модуль profile .

См. Как настроить профиль Python?

Ipython «timeit» любой скрипт:

 def foo(): %run bar.py timeit foo() 

time.clock ()

Устаревший с версии 3.3: поведение этой функции зависит от платформы: вместо этого используйте perf_counter () или process_time () , в зависимости от ваших требований, чтобы иметь четко определенное поведение.

time.perf_counter ()

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

time.process_time ()

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

 start = time.process_time() ... do something elapsed = (time.process_time() - start) 

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

 import time from datetime import timedelta start_time = time.time() # # Perform lots of computations. # elapsed_time_secs = time.time() - start_time print "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs)) 

Мне тоже нравится ответ Пола МакГира и придумал форму менеджера контекста, которая соответствовала моим потребностям.

 import datetime as dt import timeit class TimingManager(object): """Context Manager used with the statement 'with' to time some execution. Example: with TimingManager() as t: # Code to time """ clock = timeit.default_timer def __enter__(self): """ """ self.start = self.clock() self.log('\n=> Start Timing: {}') return self def __exit__(self, exc_type, exc_val, exc_tb): """ """ self.endlog() return False def log(self, s, elapsed=None): """Log current time and elapsed time if present. :param s: Text to display, use '{}' to format the text with the current time. :param elapsed: Elapsed time to display. Dafault: None, no display. """ print s.format(self._secondsToStr(self.clock())) if(elapsed is not None): print 'Elapsed time: {}\n'.format(elapsed) def endlog(self): """Log time for the end of execution with elapsed time. """ self.log('=> End Timing: {}', self.now()) def now(self): """Return current elapsed time as hh:mm:ss string. :return: String. """ return str(dt.timedelta(seconds = self.clock() - self.start)) def _secondsToStr(self, sec): """Convert timestamp to h:mm:ss string. :param sec: Timestamp. """ return str(dt.datetime.fromtimestamp(sec)) 

Существует модуль timeit который может использоваться для временного времени выполнения питонных кодов. Он содержит подробную документацию и примеры в документах python ( https://docs.python.org/2/library/timeit.html )

Это ответ Пола МакГира, который работает для меня. На всякий случай у кого-то возникли проблемы с запуском этого.

 import atexit from time import clock def reduce(function, iterable, initializer=None): it = iter(iterable) if initializer is None: value = next(it) else: value = initializer for element in it: value = function(value, element) return value 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) def endlog(): end = clock() elapsed = end-start log("End Program", secondsToStr(elapsed)) def now(): return secondsToStr(clock()) def main(): start = clock() atexit.register(endlog) log("Start Program") 

вызовите timing.main() из вашей программы после импорта файла.

Чтобы использовать обновленный ответ metakermit для python 2.7, вам понадобится монотонный пакет.

Затем код будет выглядеть следующим образом:

 from datetime import timedelta from monotonic import monotonic start_time = monotonic() end_time = monotonic() print(timedelta(seconds=end_time - start_time)) 

Время выполнения программы программы Python может быть непоследовательным в зависимости от:

  • Та же программа может быть оценена с использованием разных алгоритмов
  • Время работы варьируется между алгоритмами
  • Время выполнения варьируется между реализациями
  • Продолжительность работы зависит от компьютеров
  • Продолжительность работы не предсказуема на основе небольших входов

Это объясняется тем, что наиболее эффективным способом является «Порядок роста» и выучить примечание «О», чтобы сделать это правильно, https://en.wikipedia.org/wiki/Big_O_notation

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

 import time now = time.time() future = now + 10 step = 4 # why 4 steps? because until here already 4 operations executed while time.time() < future: step += 3 # why 3 again? because while loop execute 1 comparison and 1 plus equal statement step += 4 # why 3 more? because 1 comparison starting while when time is over plus final assignment of step + 1 and print statement print(str(int(step / 10)) + " steps per second") 

Надеюсь, это поможет вам.

Просто используйте модуль timeit . Он работает как с Python 2, так и с Python 3

 import timeit start = timeit.default_timer() #ALL THE PROGRAM STATEMETNS stop = timeit.default_timer() execution_time = stop - start print("Program Executed in "+execution_time) #It returns time in sec 

Он возвращается в секундах, и вы можете получить время выполнения. Просто, но вы должны написать их в Главной функции, которая запускает выполнение программы. Если вы хотите получить время выполнения, даже когда вы получите ошибку, тогда возьмите свой параметр «Начать» и подсчитайте там, как

 def sample_function(start,**kwargs): try: #your statements Except: #Except Statements stop = timeit.default_timer() execution_time = stop - start print("Program Executed in "+execution_time) 
  • Проверка скорости Python - Разница во времени - миллисекунды
  • Как получить секунды с эпохи с момента выхода + даты gmtime () в Python?
  • В Python, как отображать текущее время в читаемом формате
  • В python, как проверить, действительна ли дата?
  • Счетчик времени Python в событиях Pygame-mouse
  • Как установить nltk_contrib в Anaconda
  • Преобразование (YYYY-MM-DD-HH: MM: SS) дата времени
  • Разница во времени Python
  • Python - лучший язык программирования в мире.