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

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

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


person john2x    schedule 12.10.2009    source источник


Ответы (33)


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

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

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

Печать:

--- 0.764891862869 seconds ---
person rogeriopvl    schedule 13.10.2009
comment
при этом рассчитывается реальное время (включая время, используемое другими программами), поэтому будет казаться, что это займет больше времени, когда ваш компьютер занят другими делами - person newacct; 13.10.2009
comment
в Windows сделайте то же самое, но используйте time.clock () вместо time.time (). Вы получите немного лучшую точность. - person Corey Goldberg; 13.10.2009
comment
Я рекомендую делать round(time.time() - start_time, 2) (или любое другое десятичное число, которое вы хотите), я получал научные числа, например, 1.24e-5. - person ThorSummoner; 06.02.2015
comment
@ThorSummoner: вы, вероятно, захотите здесь '%.2f' вместо round(). - person jfs; 03.03.2015
comment
@CoreyGoldberg: если вы хотите time.clock() в Windows и time.time() в других системах, используйте timeit.default_timer(). Это time.perf_counter() в последней версии Python. Хотя для больших интервалов (дней) time.time() может везде давать лучшие результаты. - person jfs; 03.03.2015
comment
В этом методе есть большой недостаток. Если системное время изменяется во время работы программы (например, синхронизация с сервером времени), этот метод не работает или даже может нарушить код (отрицательная продолжительность ...) - person Gilad; 09.11.2016
comment
time.clock() устарел в python 3.7+, и вы получите предупреждения. Начиная с python 3.3 вам лучше делать то же самое, но использовать time.process_time() или time.perf_counter(). perf_counter - если вы хотите изолировать одну функцию, а process_time фиксирует реальное время для ЦП во всей системе. - person Marc Maxmeister; 30.01.2020
comment
Я вижу, это ограничено 1/10 секунды или более. Если вам нужны временные метки с высоким разрешением для измерения миллисекунд или микросекунд, вот некоторые из них: stackoverflow.com/questions/38319606/ - person Gabriel Staples; 05.04.2020
comment
Если на main() произошла ошибка, он не распечатает время, которое я потребовал. Стоит ли запускать его под try-catch-finally? - person alper; 21.05.2020
comment
Блокноты Jupyter используют %%time в начале ячейки. См. Ответ Мэтта ниже. - person Axel Bregnsbo; 15.11.2020

Я помещаю этот 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.)

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

person PaulMcG    schedule 13.10.2009
comment
Это настоящее чистое решение, которое также работает, если вы нажмете Ctrl-C, чтобы остановить программу. - person sorin; 09.06.2010
comment
отличное решение, я обязательно воспользуюсь им и создам декоратор времени для определения узких мест - person c24b; 16.05.2014
comment
Для Python 3 добавьте from functools import reduce вверху и заключите в скобки каждый оператор печати. Работает отлично! - person PowerApp101; 05.04.2015
comment
@ PowerApp101 - Спасибо - ответ Никоджо предоставляет версию этого модуля, совместимую с Py3. - person PaulMcG; 05.04.2015
comment
Примечание. Time.clock () не рекомендуется, начиная с версии 3.3: поведение этой функции зависит от платформы: вместо этого используйте perf_counter () [со временем ожидания] или process_time () [без времени ожидания], в зависимости от ваших требований, чтобы иметь четко определенное поведение. - person mab; 19.10.2015
comment
Мне нравится это решение, но оно выдает неприятное предупреждение из-за неиспользованного импорта. Помимо этого, отлично работает, хотя его можно упростить до меньшего количества строк. - person Roman Rdgz; 27.10.2016

В Linux или Unix:

$ time python yourprogram.py

В Windows см. Этот вопрос StackOverflow: Как измерить время выполнения команды в командной строке Windows?

Для более подробного вывода

$ time -v python yourprogram.py
    Command being timed: "python3 yourprogram.py"
    User time (seconds): 0.08
    System time (seconds): 0.02
    Percent of CPU this job got: 98%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.10
    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): 9480
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 1114
    Voluntary context switches: 0
    Involuntary context switches: 22
    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
person steveha    schedule 12.10.2009
comment
Итак, если я запускаю другой виджет, например, в приложении QT, как рассчитать время, необходимое этому виджету, чтобы появиться? - person Ciasto piekarz; 18.12.2013
comment
В случае виджета, если вы запускаете программу на Python, используйте принятый ответ от rogeriopvl. - person steveha; 18.12.2013
comment
но это, кажется, не дает времени в минутах: секундах, это заканчивается плавающим числом !! - person Ciasto piekarz; 19.12.2013
comment
Да, дает количество секунд. Вы можете преобразовать в мин: секунды, если хотите. Посмотрите на ответ Пола Макгуайра и его secondsToStr() функцию. - person steveha; 19.12.2013

import time

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

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

person newacct    schedule 13.10.2009
comment
time.time () лучше всего использовать в * nix. time.clock () лучше всего использовать в Windows. - person Corey Goldberg; 13.10.2009
comment
Я считаю, что это нельзя использовать для расчета только времени, используемого этим процессом, потому что он использует системное время и будет зависеть от других системных процессов? Поправьте меня, если я ошибаюсь :) - person AnnanFay; 23.07.2013
comment
Примечание. Time.clock () устарела с версии 3.3: поведение этой функции зависит от платформы: вместо этого используйте perf_counter () [со временем ожидания] или process_time () [без времени ожидания], в зависимости от ваших требований, чтобы иметь четко определенное поведение. - person mab; 19.10.2015

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

or

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))
person metakermit    schedule 29.09.2014
comment
@phansen: здесь можно использовать timedelta(seconds=time.monotonic()-start) (или time.time(), если интервал большой). Не вычитайте наивные объекты datetime, которые представляют местное время; местное время не однообразное - person jfs; 03.03.2015
comment
ОК, ты имеешь в виду как start_time = time.monotonic(); end_time = time.monotonic(); timedelta(seconds=end_time - start_time). Надеюсь, вы правы, но вам также придется отформатировать его, когда вы вернетесь datetime.timedelta(0, 0, 76). Кроме того, похоже, монотонный метод был добавлен только в Python 3. - person metakermit; 04.03.2015
comment
Ах хорошо. Я вижу, вы можете передать его str(), чтобы он стал человеком. Обновлю ответ, спасибо. - person metakermit; 04.03.2015

Мне очень нравится ответ Пола Макгуайра, но я использую Python 3. Так что для тех, кому интересно: вот модификация его ответа который работает с 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")

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

person Nicojo    schedule 10.09.2012
comment
Я нашел timedelta(seconds=t).total_seconds() полезным. - person nu everest; 28.11.2015
comment
Вы можете объяснить, что делают эти функции? что указано в команде журнала? что такое атексит? - person SumNeuron; 10.12.2016
comment
@SumNeuron, короче говоря, эти функции распечатывают время выполнения программы, с которой вы их используете. s - это первый аргумент для регистрации, который должен быть строкой. log - это функция, которая выводит информацию о времени. atexit - это модуль Python, который позволяет вам регистрировать функции, которые будут вызываться при выходе из программы. - person Nicojo; 11.12.2016
comment
@Nicojo Очень полезно. У меня вопрос, как я могу использовать этот код для проверки, например, времени выполнения цикла. предположим, у меня есть функция, включающая цикл, и я хочу получить время, потраченное на этот цикл - person moudi; 13.06.2019
comment
@moudi Лучший ответ на этот вопрос - ваш лучший выбор. Просто установите время начала прямо перед циклом и вычислите прошедшее время на выходе из цикла. - person Nicojo; 14.06.2019
comment
Могу ли я использовать его для измерения времени участка кода в более крупном модуле? Я пробовал, и кажется, что он останавливает часы только после того, как основной останавливает выполнение. - person ruslaniv; 28.04.2020
comment
Извините, если это глупый вопрос, но где мне разместить свою функцию внутри этого кода, чтобы измерить время ее выполнения? Что здесь за заполнитель? - person Jan Kowalski; 29.06.2020

Вы можете использовать профилировщик Python 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}
person jacwah    schedule 02.01.2014
comment
@jacwah Как вы суммируете общее время? - person Chuck; 04.11.2018
comment
@Chuck В первой строке написано X function calls in Y CPU seconds. Если вам нужны настенные часы, используйте один из других ответов здесь. - person jacwah; 05.11.2018

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

import timeit

start = timeit.default_timer()

# All the program statements
stop = timeit.default_timer()
execution_time = stop - start

print("Program Executed in "+str(execution_time)) # It returns time in seconds

Он возвращается через секунды, и вы можете получить время выполнения. Это просто, но вы должны записать их в функции w main, которая запускает выполнение программы. Если вы хотите получить время выполнения даже при возникновении ошибки, возьмите к нему свой параметр «Старт» и вычислите его следующим образом:

def sample_function(start,**kwargs):
     try:
         # Your statements
     except:
         # except statements run when your statements raise an exception
         stop = timeit.default_timer()
         execution_time = stop - start
         print("Program executed in " + str(execution_time))
person Ravi Kumar    schedule 18.09.2017
comment
Не должно быть той части под finally частью? - person alper; 21.05.2020

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

$ 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
person u0b34a0f6ae    schedule 13.10.2009

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)
person Yas    schedule 18.05.2016
comment
Возможно, начнем с вывода: Использовать time.process_time () (или подобное)? - person Peter Mortensen; 27.11.2019

Следующий фрагмент кода выводит истекшее время в удобном для чтения формате <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)    
person Sandeep    schedule 01.07.2016
comment
здесь можно найти наиболее разумный ответ («разумный» означает максимальное использование встроенных функций и, следовательно, минимальное количество наборов текста). - person ijoseph; 20.07.2017

Для специалистов по работе с данными, использующих Jupyter Notebook

В ячейке вы можете использовать волшебную команду Jupyter %%time для измерения времени выполнения:

%%time
[ x**2 for x in range(10000)]

Выход

CPU times: user 4.54 ms, sys: 0 ns, total: 4.54 ms
Wall time: 4.12 ms

Это будет фиксировать только время выполнения конкретной ячейки. Если вы хотите зафиксировать время выполнения всей записной книжки (т.е. программы), вы можете создать новую записную книжку в том же каталоге и в новой записной книжке выполнить все ячейки:

Предположим, указанный выше блокнот называется example_notebook.ipynb. В новой записной книжке в том же каталоге:

# Convert your notebook to a .py script:
!jupyter nbconvert --to script example_notebook.ipynb

# Run the example_notebook with -t flag for time
%run -t example_notebook

Выход

IPython CPU timings (estimated):
  User   :       0.00 s.
  System :       0.00 s.
Wall time:       0.00 s.
person Matt    schedule 28.07.2018

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

import time
start_time = time.time()
main()
seconds = time.time() - start_time
print('Time Taken:', time.strftime("%H:%M:%S",time.gmtime(seconds)))

Пример вывода

Time Taken: 00:00:08
person user 923227    schedule 12.03.2020
comment
Именно то, что я искал! Спасибо! - person Bernardo Troncoso; 22.06.2021

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

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))
person Gall    schedule 29.01.2015

В IPython "timeit" любой скрипт:

def foo():
    %run bar.py
timeit foo()
person B.Kocis    schedule 20.05.2015
comment
Если вы используете %%timeit (два процента), вы можете сохранить определение функции foo, как показано этим связанным ответом. - person ojdo; 01.07.2021

Я посмотрел на модуль 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 в timeit выше, если хотите использовать тот же таймер, что и модуль profile.

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

person jfs    schedule 03.03.2015

Позже ответ, но я использую встроенный timeit:

import timeit
code_to_test = """
a = range(100000)
b = []
for i in a:
    b.append(i*2)
"""
elapsed_time = timeit.timeit(code_to_test, number=500)
print(elapsed_time)
# 10.159821493085474

  • Оберните весь свой код, включая любой импорт, который у вас может быть, внутри code_to_test.
  • number аргумент указывает, сколько раз код должен повторяться.
  • Демо
person Pedro Lobito    schedule 25.02.2020
comment
А что, если вы хотите отследить какой-то фрагмент кода, который нельзя поместить в строку? - person Daniel; 22.04.2020
comment
@daniel Вы можете создать новый вопрос. Если вы разместите ссылку здесь, возможно, я смогу вам помочь. - person Pedro Lobito; 14.05.2020
comment
Да, я ненавижу запускать код в строке только для удовлетворения timeit () - person WestCoastProjects; 09.07.2021

Используйте line_profiler.

line_profiler будет профилировать время, необходимое для выполнения отдельных строк кода. Профилировщик реализован на C через Cython, чтобы уменьшить накладные расходы на профилирование.

from line_profiler import LineProfiler
import random

def do_stuff(numbers):
    s = sum(numbers)
    l = [numbers[i]/43 for i in range(len(numbers))]
    m = ['hello'+str(numbers[i]) for i in range(len(numbers))]

numbers = [random.randint(1,100) for i in range(1000)]
lp = LineProfiler()
lp_wrapper = lp(do_stuff)
lp_wrapper(numbers)
lp.print_stats()

Результатом будут:

Timer unit: 1e-06 s

Total time: 0.000649 s
File: <ipython-input-2-2e060b054fea>
Function: do_stuff at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           def do_stuff(numbers):
     5         1           10     10.0      1.5      s = sum(numbers)
     6         1          186    186.0     28.7      l = [numbers[i]/43 for i in range(len(numbers))]
     7         1          453    453.0     69.8      m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
person Yu Jiaao    schedule 28.03.2018
comment
Очень красивый пример. Хорошо соответствует моим потребностям. Спасибо, что поделились. - person C. Cooney; 16.11.2020

Я использовал очень простую функцию для определения времени выполнения части кода:

import time
def timing():
    start_time = time.time()
    return lambda x: print("[{:.2f}s] {}".format(time.time() - start_time, x))

И чтобы использовать его, просто вызовите его перед кодом для измерения, чтобы получить время функции, а затем вызовите функцию после кода с комментариями. Время будет отображаться перед комментариями. Например:

t = timing()
train = pd.read_csv('train.csv',
                        dtype={
                            'id': str,
                            'vendor_id': str,
                            'pickup_datetime': str,
                            'dropoff_datetime': str,
                            'passenger_count': int,
                            'pickup_longitude': np.float64,
                            'pickup_latitude': np.float64,
                            'dropoff_longitude': np.float64,
                            'dropoff_latitude': np.float64,
                            'store_and_fwd_flag': str,
                            'trip_duration': int,
                        },
                        parse_dates = ['pickup_datetime', 'dropoff_datetime'],
                   )
t("Loaded {} rows data from 'train'".format(len(train)))

Тогда результат будет выглядеть так:

[9.35s] Loaded 1458644 rows data from 'train'
person Tao Wang    schedule 07.08.2018

У меня была такая же проблема во многих местах, поэтому я создал удобный пакет horology. Вы можете установить его с помощью pip install horology, а затем сделать это элегантным способом:

from horology import Timing

with Timing(name='Important calculations: '):
    prepare()
    do_your_stuff()
    finish_sth()

выведет:

Important calculations: 12.43 ms

Или еще проще (если у вас одна функция):

from horology import timed

@timed
def main():
    ...

выведет:

main: 7.12 h

Он заботится о единицах и округлении. Он работает с Python 3.6 или новее.

person hans    schedule 07.12.2019
comment
@DarrenZou Проверьте другие документы и источники здесь - person hans; 11.12.2019
comment
Могу ли я получить эти значения в переменной? - person PepeElMago33; 16.02.2020
comment
Да, используйте main.interval. - person hans; 16.02.2020

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

Default_timer - это метод этого класса, который используется для измерения времени настенных часов, а не времени выполнения ЦП. Таким образом, выполнение другого процесса может помешать этому. Таким образом, это полезно для небольших блоков кода.

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

from timeit import default_timer as timer

start= timer()

# Some logic

end = timer()

print("Time taken:", end-start)
person Utkarsh Dhawan    schedule 16.11.2017

Сначала установите пакет humanfriendly, открыв командную строку (CMD) от имени администратора и введите там - pip install humanfriendly

Код:

from humanfriendly import format_timespan
import time
begin_time = time.time()
# Put your code here
end_time = time.time() - begin_time
print("Total execution time: ", format_timespan(end_time))

Выход:

введите описание изображения здесь

person Amar Kumar    schedule 16.04.2020

Существует модуль timeit, который можно использовать для измерения времени выполнения кода Python.

Подробная документация и примеры содержатся в документации Python, 26.6. timeit - измеряйте время выполнения небольших фрагментов кода.

person Alfie    schedule 20.10.2014
comment
OP явно упоминает timeit в вопросе. Вопрос в том, как его можно здесь использовать (или нужно ли его здесь использовать и какие есть альтернативы). Вот возможный ответ. - person jfs; 03.03.2015

Вы делаете это просто на Python. Нет необходимости усложнять.

import time

start = time.localtime()
end = time.localtime()
"""Total execution time in minutes$ """
print(end.tm_min - start.tm_min)
"""Total execution time in seconds$ """
print(end.tm_sec - start.tm_sec)
person Mitul Panchal    schedule 16.02.2019
comment
Что ж, если выполнение занимает минуты ... это решение не может решить эту проблему. - person swateek; 29.09.2020

Я попробовал и нашел разницу во времени, используя следующие сценарии.

import time

start_time = time.perf_counter()
[main code here]
print (time.perf_counter() - start_time, "seconds")
person Hafez Ahmad    schedule 08.05.2020
comment
time.perf_counter (): float - Возвращает значение (в долях секунды) счетчика производительности, то есть часы с самым высоким доступным разрешением для измерения короткой продолжительности. Он включает время, прошедшее во время сна, и является общесистемным. Контрольная точка возвращаемого значения не определена, поэтому действительна только разница между результатами последовательных вызовов. docs.python.org/3/library/time.html#time. perf_counter - person James McGuigan; 17.06.2020

Для функций я предлагаю использовать этот простой декоратор, который я создал.

def timeit(method):
    def timed(*args, **kw):
        ts = time.time()
        result = method(*args, **kw)
        te = time.time()
        if 'log_time' in kw:
            name = kw.get('log_name', method.__name__.upper())
            kw['log_time'][name] = int((te - ts) * 1000)
        else:
            print('%r  %2.22f ms' % (method.__name__, (te - ts) * 1000))
        return result
    return timed

@timeit
def foo():
    do_some_work()


# 'foo'  0.000953 ms
person Nikita Tonkoskur    schedule 29.10.2020

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

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() из своей программы.

person Saurabh Rana    schedule 08.04.2015

Следуя этому ответу, был создан простой, но удобный инструмент.

import time
from datetime import timedelta

def start_time_measure(message=None):
    if message:
        print(message)
    return time.monotonic()

def end_time_measure(start_time, print_prefix=None):
    end_time = time.monotonic()
    if print_prefix:
        print(print_prefix + str(timedelta(seconds=end_time - start_time)))
    return end_time

Использование:

total_start_time = start_time_measure()    
start_time = start_time_measure('Doing something...')
# Do something
end_time_measure(start_time, 'Done in: ')
start_time = start_time_measure('Doing something else...')
# Do something else
end_time_measure(start_time, 'Done in: ')
end_time_measure(total_start_time, 'Total time: ')

Выход:

Doing something...
Done in: 0:00:01.218000
Doing something else...
Done in: 0:00:01.313000
Total time: 0:00:02.672000
person Nick Legend    schedule 26.11.2020

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

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

Это связано с тем, что наиболее эффективным способом является использование «Порядка роста» и изучение нотации с большой буквой «О», чтобы сделать это правильно.

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

import time

now = time.time()
future = now + 10
step = 4 # Why 4 steps? Because until here already four operations executed
while time.time() < future:
    step += 3 # Why 3 again? Because a while loop executes one comparison and one plus equal statement
step += 4 # Why 3 more? Because one comparison starting while when time is over plus the final assignment of step + 1 and print statement
print(str(int(step / 10)) + " steps per second")
person Manu    schedule 31.07.2017

Это самый простой способ узнать затраченное время для программы:

Напишите следующий код в конце вашей программы.

import time
print(time.clock())
person Kushal Ghosh    schedule 21.06.2019
comment
main: 1: DeprecationWarning: time.clock устарел в Python 3.3 и будет удален из Python 3.8: вместо этого используйте time.perf_counter или time.process_time - person JayRizzo; 05.07.2019

Чтобы использовать обновленный ответ metakermit для Python 2.7, вам потребуется monotonic.

Тогда код будет следующим:

from datetime import timedelta
from monotonic import monotonic

start_time = monotonic()
end_time = monotonic()
print(timedelta(seconds=end_time - start_time))
person H0R5E    schedule 16.06.2017

Если вы хотите измерять время в микросекундах, вы можете использовать следующую версию, полностью основанную на ответах Пола Макгуайра и Nicojo - это код Python 3. Я также добавил к нему немного цвета:

import atexit
from time import time
from datetime import timedelta, datetime


def seconds_to_str(elapsed=None):
    if elapsed is None:
        return datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    else:
        return str(timedelta(seconds=elapsed))


def log(txt, elapsed=None):
    colour_cyan = '\033[36m'
    colour_reset = '\033[0;0;39m'
    colour_red = '\033[31m'
    print('\n ' + colour_cyan + '  [TIMING]> [' + seconds_to_str() + '] ----> ' + txt + '\n' + colour_reset)
    if elapsed:
        print("\n " + colour_red + " [TIMING]> Elapsed time ==> " + elapsed + "\n" + colour_reset)


def end_log():
    end = time()
    elapsed = end-start
    log("End Program", seconds_to_str(elapsed))


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

log () => функция, которая распечатывает информацию о времени.

txt ==> первый аргумент для регистрации и его строка для отметки времени.

atexit ==> Модуль Python для регистрации функций, которые вы можете вызывать при выходе из программы.

person Rui Carvalho    schedule 20.12.2018

time.clock устарел в Python 3.3 и будет удален из Python 3.8: используйте вместо этого time.perf_counter или time.process_time

import time
start_time = time.perf_counter ()
for x in range(1, 100):
    print(x)
end_time = time.perf_counter ()
print(end_time - start_time, "seconds")
person Md. Imrul Kayes    schedule 20.06.2021