как узнать время выполнения программы python
Как работает timeit в Python?
Модуль Python timeit — это простой интерфейс для быстрого измерения времени выполнения небольших блоков кода.
Когда вы создаете приложение, вы можете задаться вопросом, как этот блок кода будет работать, и захотите протестировать его в различных сценариях.
Для этого модуль timeit предоставляет очень простое решение этой проблемы. Давайте посмотрим, как мы можем использовать это для синхронизации наших фрагментов кода.
Мы рассмотрим как интерфейс командной строки, так и вызываемый интерфейс.
Python timeit — интерфейс командной строки
Интерфейс командной строки очень похож на интерфейс запуска программы Python.
По умолчанию это будет запускать код 1 миллион раз в Linux и 20 миллионов раз в Windows и измерять лучшее время среди этих значений. Ниже приведены результаты моей системы Linux.
Обратите внимание, что если у вас уже есть цикл for в вашем фрагменте, модуль гарантирует, что общее количество итераций близко к 1 миллиону, поэтому весь ваш цикл не будет выполняться 1 миллион раз.
Мы также можем использовать timeit через интерпретатор Python и импортировать его, используя:
Использование модуля
Давайте теперь посмотрим, как мы можем использовать timeit для timeit времени сниппета внутри нашей программы.
Что, если ваш код требует предварительной настройки? А если вам тоже нужно импортировать определенные модули?
Что ж, решение этой проблемы — использовать блок кода настройки, который выполнит всю необходимую работу по настройке всех необходимых модулей и переменных.
Написать блок настройки очень просто. Вы просто пишете любой код, который вам нужен, и передаете его в виде строки в переменную.
timeit гарантирует, что настройка будет выполнена до измерения вашего основного цикла, поэтому он выполняется только один раз.
Этот код пытается получить все подмассивы из начального элемента массива numpy. Обратите внимание, что блок настройки запускается только один раз.
Сравните производительность блоков кода
Время, затрачиваемое на блок кода, будет текущим временем минус начальное время, взятое за эталон, которое вы можете передавать через переменные.
Давайте протестируем 2 функции в массиве numpy range() и np.arange() и посмотрим, как они сравниваются.
Таким образом, мы могли легко использовать timeit для сравнения производительности различных функций.
Время для конкретной функции
Мы также можем рассчитать время выполнения определенной функции в сценарии, не выполняя другие блоки кода.
Как получить время выполнения программы Python?
У меня есть программа командной строки в Python, который занимает некоторое время, чтобы закончить. Я хочу знать точное время, которое нужно, чтобы закончить бег.
и timeit module, но, похоже, это только для небольших фрагментов кода. Я хочу засечь время всей программы.
24 ответов
самый простой способ в Python:
это предполагает, что ваша программа занимает по крайней мере десятую часть секунды для запуска.
Я положил это timing.py модуль в свои
time.clock() возвращает процессорное время, что позволяет рассчитать только время, используемое этим процессом (в Unix в любом случае). В документации говорится:»в любом случае, это функция для использования для бенчмаркинга Python или алгоритмов синхронизации»
Мне очень нравится ответ пола Макгира, но я использую Python3. Итак, для тех, кому интересно: вот модификация его ответа, которая работает с Python 3 на *nix (я полагаю, под Windows, что часы () должны использоваться вместо time ()):
Если вы считаете это полезным, вы все равно должны проголосовать за его ответ вместо этого, так как он сделал большую часть работы ;).
вы можете использовать профайл python profiler для измерения процессорного времени и дополнительно, сколько времени тратится внутри каждой функции и сколько раз вызывается каждая функция. Это очень полезно, если вы хотите улучшить производительность вашего скрипта, не зная, с чего начать. ответ к другому вопросу SO довольно хорошо. Всегда хорошо посмотреть в документы тоже.
вот пример того, как профилировать скрипт с помощью cProfile из командной строки:
мне нравится вывод datetime модуль обеспечивает, где объекты перепада времени показывают дни, часы, минуты etc. по мере необходимости в удобочитаемом виде.
пример вывода, например
обновление:
еще лучше для Linux: /usr/bin/time
решение rogeriopvl отлично работает, но если вам нужна более конкретная информация, вы можете использовать встроенный профилировщик python. Проверьте эту страницу:
профилировщик говорит вам много полезной информации, такой как время, проведенное в каждой функции
я посмотрел на модуль timeit, но, похоже, это только для небольших фрагментов кода. Я хочу засечь время всей программы.
он работает your_module.main() функция один раз и печать прошедшего времени с помощью в качестве таймера.
для измерения времени процессора (например, не включают время time.sleep() ) для каждой функции вы можете использовать profile модуль ( cProfile на Python 2):
Ipython «timeit» любой скрипт:
времени.clock()
времени.perf_counter()
возвращает значение (в дробных секундах) счетчика производительности, т. е. часы с самым высоким доступным разрешением для измерения короткого продолжительность. Это тут включить время, прошедшее во время сна и общесистемный.
времени.process_time()
возвращает значение (в дробных секундах) суммы системы и время использования процессора для текущего процесса. Это не включить времени во время сна.
Просто Использовать timeit модуль. Он работает как с Python 2, так и с Python 3
он возвращается через несколько секунд, и Вы можете иметь время выполнения. Просто, но вы должны написать их в основной функции, которая запускает выполнение программы. Если вы хотите получить время выполнения, даже если вы получаете ошибку, то возьмите свой параметр «Start» и вычислите его как
есть timeit модуль, который может использоваться для времени выполнения кодов python. Он имеет подробную документацию и примеры в документах python (https://docs.python.org/2/library/timeit.html)
Мне тоже нравится ответ пола Макгира и придумал форму контекстного менеджера, которая больше соответствовала моим потребностям.
это ответ пола Макгира, который работает для меня. На случай, если у кого-то возникнут проблемы с управлением.
вызов timing.main() из вашей программы после импорта файла.
Timeit-класс в python, используемый для вычисления времени выполнения небольших блоков кода.
Default_timer-это метод в этом классе, который используется для измерения времени настенных часов, а не времени выполнения процессора. Таким образом, этому может помешать другое выполнение процесса. Таким образом, он полезен для небольших блоков кода.
пример кода выглядит следующим образом:
line_profiler будет профилировать время выполнения отдельных строк кода. Профилировщик реализован в C через Cython, чтобы уменьшить накладные расходы на профилирование.
для людей данных, использующих Jupyter Notebooks
в ячейку, вы можете использовать Jupyter это %%time волшебная команда для измерения времени выполнения:
выход
Время процессора: пользователь 4.54 ms, sys: 0 ns, всего: 4.54 ms
Время стены: 4,12 МС
это будет захватывать только время выполнения конкретной ячейки. Если вы хотите записать время выполнения всего ноутбука (т. е. программы), вы можете создать новый ноутбук в тот же каталог и в новом ноутбуке выполните все ячейки:
выход
IPython тайминги процессора (оценочные): Пользователь: 0.00 s.
Система: 0.00 s.
Время стены: 0.00 s.
использовать обновленный ответ metakermit для python 2.7 вам потребуется монотонная.
код будет выглядеть следующим образом:
время выполнения программы Python может быть несовместимым в зависимости от:
Это потому, что наиболее эффективным способом является использование «Порядок роста» и выучите большую нотацию «о», Чтобы сделать это правильно,https://en.wikipedia.org/wiki/Big_O_notation
в любом случае вы можете попытаться оценить производительность любой программы Python в конкретных шагах подсчета машин в секунду, используя этот простой алгоритм: адаптируйте это к программе, которую вы хотите оценить
надеюсь, это поможет вам.
я использовал очень простую функцию для синхронизации части выполнения кода:
и использовать его, просто вызовите его перед кодом для измерения, чтобы получить функцию синхронизации, затем вызовите функцию после кода с комментариями, и время появится перед комментариями, например:
тогда выход будет выглядеть так:
Я чувствую себя немного элегантной таким образом.
Как мне узнать время выполнения программы на Python?
У меня есть программа командной строки на Python, которая требует времени, чтобы закончить. Я хочу знать точное время, необходимое для завершения бега.
27 ответов
Самый простой способ в Python:
Это предполагает, что вашей программе требуется не менее десятой секунды для запуска.
Чтобы использовать обновленный ответ metakermit для Python 2.7, вам потребуется монотонный пакет.
Тогда код будет следующим:
Время выполнения программы Python может быть несогласованным в зависимости от:
Это потому, что наиболее эффективным способом является использование «Порядка роста» и изучение большой нотации «О» сделать это правильно.
В любом случае, вы можете попытаться оценить производительность любой программы Python на конкретном подсчете числа шагов в секунду, используя этот простой алгоритм: адаптируйте это к программе, которую вы хотите оценить
Пример кода выглядит следующим образом:
Вызовите timing.main() из вашей программы после импорта файла.
Вы делаете это просто в Python. Нет необходимости усложнять.
Я использовал очень простую функцию для измерения времени выполнения кода:
И чтобы использовать его, просто вызовите его перед кодом для измерения, чтобы получить синхронизацию функции, а затем вызовите функцию после кода с комментариями. Время появится перед комментариями. Например:
Тогда вывод будет выглядеть так:
Или даже проще (если у вас есть одна функция):
Он заботится о единицах и округлениях. Он работает с Python 3.6 или новее.
Line_profiler профилирует время выполнения отдельных строк кода. Профилировщик реализован в C с помощью Cython, чтобы уменьшить накладные расходы на профилирование.
Результаты будут такими:
Я посмотрел на модуль timeit, но кажется, что он только для небольших фрагментов кода. Я хочу, чтобы время всей программы.
Он запускает функцию your_module.main() один раз и печатает прошедшее время, используя функцию time.time() в качестве таймера.
Чтобы измерить время процессора (например, не включать время в течение time.sleep() ) для каждой функции, вы можете использовать модуль profile ( cProfile в Python 2):
Модуль timeit в Python
Когда дело доходит до измерения времени выполнения фрагмента кода Python, у нас есть много идей. Как насчет простого использования модуля времени и экономии времени до и после выполнения программы? Звучит легко и хорошо, но это не так.
Когда программа выполняется, также запускаются многие фоновые процессы, чтобы сделать этот код исполняемым. Модуль времени не учитывает эти процессы. Если вам нужны точные измерения производительности времени, то модуль timeit – это то, что вам нужно.
Модуль timeit в Python запускает кусок кода 1 миллион раз (значение по умолчанию) и учитывает минимальное количество времени, которое потребовалось для запуска этого фрагмента кода. Давайте посмотрим, как работает модуль здесь.
Определение времени
Есть много способов использовать модуль timeit. Один из самых простых способов – использовать его непосредственно в CLI. Мы сделаем это в нашем первом примере, прежде чем перейти к другим примерам.
Пример
Мы начнем с использования модуля timeit непосредственно из интерфейса командной строки Python. Когда используется CLI, мы заметим, что модуль сам определяет количество повторений, выполняемых для одного и того же фрагмента кода. Вот примеры команд, которые мы выполнили для разных выражений:
Посмотрим на результат этой программы:
Выбор времени для фрагмента кода
Самое лучшее в модуле timeit – это то, что мы можем выбрать точный фрагмент кода, для которого мы хотим измерить производительность. Мы определим код установки и код для проверки производительности отдельно. Код установки запускается только один раз, тогда как основной код запускается 1 миллион раз:
Посмотрим на результат этой программы:
Обратите внимание, что лучше всего сохранить операторы импорта в самом коде установки, чтобы не вносить никаких изменений при выполнении основного кода.
Время записи для многострочного кода из CLI
Если создание сценария для вас неосуществимо и вы хотите быстро проверить код на его производительность, также можно использовать код непосредственно из интерфейса командной строки:
Посмотрим на результат этой программы:
Обычно сравнивают два блока кода
Если вам нужна действительно простая идея, сравнивая два фрагмента кода о том, насколько быстро один прогон формирует другой, есть довольно простой способ сделать это:
Просто используйте функцию default_timer(), чтобы запустить время и снова, чтобы найти для нее разницу. Это самый простой способ использовать модуль для определения производительности кода. Это также заставляет вас делать свой код в виде функций, которые являются модульными объектами.
Другой способ сделать то же самое, не касаясь исходного скрипта, скажем test.py, который содержит такие функции, как:
Используйте модуль timeit следующим образом:
Как можно засечь время выполнения каждой из функций и суммарное время выполнения программы
Есть код с тремя сотрировками, есть отчет о времени выполнения программы. Как можно засечь время выполнения каждой из функций и суммарное время выполнения программы. Еще, если не сложно, посоветуйте как сократить программу.
4 ответа 4
Чтобы измерить время выполнения программы, можно time команду использовать (часто встроена в shell):
Чтобы посмотреть сколько времени индивидуальные функции занимают, можно cProfile модуль использовать:
В графическом виде результаты удобно в KCachegrind просматривать. Пример команд. Больше вариантов: How can you profile a script?
line_profiler позволяет построчно сравнение производить.
Содержание:
timeit
Чтобы измерить производительность отдельной функции, можно timeit модуль использовать:
Тот же интерфейс предоставляет pyperf модуль (помимо прочего):
Для интерактивной работы можно %timeit magic в ipython/jupyter notebook использовать.
reporttime.py
Оптимизируя выполнение функции, стоит убедиться что она работает корректно (тесты), что изменения действительно ускорили её работу (сравнение производительности). Для этого можно pytest-benchmark использовать.
Результаты
Таблица показывает, что на уже отсортированном вводе sorted_insertion() функция заметно выигрывает (в этом случае линейное время для этой функции требуется по сравнению с квадратичным для sorted_selection() и sorted_bubble() ). Для случайного ввода, производительность примерно одинаковая. sorted_bubble() хуже во всех вариантах.
make-figures.py
Чтобы нарисовать время выполнения функций для разных вводов:
Результаты
Рисунки подтверждают, что sorted_insertion() показывает линейное поведение на отсортированном вводе ( seq_range =0,1,2,3,4. n-1 ). И квадратичное на случайном вводе ( seq_random ). Коэффициент перед log2(N) показывает приближённо соответствующую степень в функции роста алгоритма в зависимости от размера ввода:
reporttime + pandas
Собрав результаты измерений времени выполнения функций сортировки из daedra.py ( sorted_*() ) для разных типов (уже отсортированный/случайный) и размеров ввода (длины от 1 до 100000):
Удобно исследовать результаты интерактивно, используя pandas.DataFrame :
К примеру, чтобы сравнить поведение функций на уже отсортированном вводе:
Поведение на случайном вводе:
Или сравнить поведение одной функции для разных типов ввода на одном графике: