Меню

Как измерить время выполнения функции python



Как работает timeit в Python?

Модуль Python timeit — это простой интерфейс для быстрого измерения времени выполнения небольших блоков кода.

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

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

Мы рассмотрим как интерфейс командной строки, так и вызываемый интерфейс.

Python timeit — интерфейс командной строки

Интерфейс командной строки очень похож на интерфейс запуска программы Python.

Вам необходимо импортировать внешний модуль timeit с помощью опции -m и применить его к вашему коду.

Это запустит фрагмент, переданный в виде строки, с использованием timeit .

По умолчанию это будет запускать код 1 миллион раз в Linux и 20 миллионов раз в Windows и измерять лучшее время среди этих значений. Ниже приведены результаты моей системы Linux.

Обратите внимание, что если у вас уже есть цикл for в вашем фрагменте, модуль гарантирует, что общее количество итераций близко к 1 миллиону, поэтому весь ваш цикл не будет выполняться 1 миллион раз.

Мы также можем использовать timeit через интерпретатор Python и импортировать его, используя:

Чтобы узнать время выполнения, передайте код в виде строки в timeit.timeit() .

Мы можем контролировать количество итераций с помощью параметра number .

Использование модуля

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

Что, если ваш код требует предварительной настройки? А если вам тоже нужно импортировать определенные модули?

Что ж, решение этой проблемы — использовать блок кода настройки, который выполнит всю необходимую работу по настройке всех необходимых модулей и переменных.

Написать блок настройки очень просто. Вы просто пишете любой код, который вам нужен, и передаете его в виде строки в переменную.

После этого вы можете написать свой основной блок кода и передать его timeit.timeit() , используя параметры setup и stmt .

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

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

Сравните производительность блоков кода

Мы можем легко сравнить производительность нескольких блоков кода с помощью timeit .

Мы будем использовать для этой цели таймер, используя timeit.default_timer() .

Время, затрачиваемое на блок кода, будет текущим временем минус начальное время, взятое за эталон, которое вы можете передавать через переменные.

Давайте протестируем 2 функции в массиве numpy range() и np.arange() и посмотрим, как они сравниваются.

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

Время для конкретной функции

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

Источник

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

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

4 ответа 4

Чтобы измерить время выполнения программы, можно time команду использовать (часто встроена в shell):

Чтобы посмотреть сколько времени индивидуальные функции занимают, можно cProfile модуль использовать:

В графическом виде результаты удобно в KCachegrind просматривать. Пример команд. Больше вариантов: How can you profile a script?

line_profiler позволяет построчно сравнение производить.

Содержание:

  • timeit
  • reporttime.py
  • make-figures.py
  • reporttime + pandas

timeit

Чтобы измерить производительность отдельной функции, можно timeit модуль использовать:

Тот же интерфейс предоставляет pyperf модуль (помимо прочего):

Читайте также:  Измерить пульс с секундной стрелкой

Для интерактивной работы можно %timeit magic в ipython/jupyter notebook использовать.

reporttime.py

Оптимизируя выполнение функции, стоит убедиться что она работает корректно (тесты), что изменения действительно ускорили её работу (сравнение производительности). Для этого можно pytest-benchmark использовать.

Для удобства сравнения производительности нескольких алгоритмов, можно автоматически соответствующие функции собрать по общему префиксу в имени ( get_functions_with_prefix() ). К примеру, если функции в вопросе можно назвать: sorted_selection , sorted_insertion , sorted_bubble и поместить в daedra.py файл:

где reporttime.py . measure() функция измеряет производительность функций похожим на python -mtimeit команду способом.

Результаты

Таблица показывает, что на уже отсортированном вводе sorted_insertion() функция заметно выигрывает (в этом случае линейное время для этой функции требуется по сравнению с квадратичным для sorted_selection() и sorted_bubble() ). Для случайного ввода, производительность примерно одинаковая. sorted_bubble() хуже во всех вариантах.

make-figures.py

В качестве альтернативы можно декоратор использовать такой как @to_compare , чтобы собрать функции для сравнения и адаптировать их для make-figures.py скрипта, который измеряет производительность и строит графики. Пример.

Чтобы нарисовать время выполнения функций для разных вводов:

seq_range() , seq_random() задают два типа ввода (уже отсортированный и случайный соответственно). Можно определить дополнительные типы, определив seq_*(n) функцию. Пример запуска:

PYTHONPATH=. используется, чтобы make-figures.py смог найти plot_daedra модуль (с seq_range , seq_random функциями) в текущей директории. —maxn определяет наибольшее n , которое в seq_(n) функции передаётся.

Результаты

Рисунки подтверждают, что sorted_insertion() показывает линейное поведение на отсортированном вводе ( seq_range =0,1,2,3,4. n-1 ). И квадратичное на случайном вводе ( seq_random ). Коэффициент перед log2(N) показывает приближённо соответствующую степень в функции роста алгоритма в зависимости от размера ввода:

reporttime + pandas

Собрав результаты измерений времени выполнения функций сортировки из daedra.py ( sorted_*() ) для разных типов (уже отсортированный/случайный) и размеров ввода (длины от 1 до 100000):

Удобно исследовать результаты интерактивно, используя pandas.DataFrame :

К примеру, чтобы сравнить поведение функций на уже отсортированном вводе:

Поведение на случайном вводе:

Или сравнить поведение одной функции для разных типов ввода на одном графике:

Источник

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

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

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

24 ответов

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

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

Я положил это timing.py модуль в свои

в Linux или UNIX:

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

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

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

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

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

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

Читайте также:  Оценка погрешностей измерений при выполнении лабораторных работ по физике

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

обновление:

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

нормально, просто time является более простой оболочкой, построенной, что тени более способны /usr/bin/time .

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

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

следующий фрагмент печатает истекшее время в хорошем читаемом человеком .

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

он работает your_module.main() функция один раз и печать прошедшего времени с помощью в качестве таймера.

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

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

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

времени.clock()

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

времени.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 МС

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

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

выход
IPython тайминги процессора (оценочные): Пользователь: 0.00 s.
Система: 0.00 s.
Время стены: 0.00 s.

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

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

Читайте также:  Приборы для измерения пускового тока

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

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

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

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

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

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

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

тогда выход будет выглядеть так:

Я чувствую себя немного элегантной таким образом.

Источник

Функция timeit() модуля timeit в Python.

Измерить среднее время выполнения куска кода.

Синтаксис:

Параметры:

  • stmt=’pass’ — проверяемый код,
  • setup=’pass’ — настройка кода,
  • timer= — используемый таймер,
  • number=1000000 — число циклов измерений,
  • globals=None — область видимости.

Возвращаемое значение:

  • float время выполнения кода в цикле number раз.

Описание:

Функция timeit() модуля timeit возвращает время, необходимое для выполнения основного выражения number количество раз. Для этого создает экземпляр timeit.Timer() с заданным выражением stmt , кодом настройки setup и функцией таймера timer и запускает его метод Timer.timeit() с заданным number числом выполнений в цикле.

Необязательный аргумент globals указывает пространство имен для выполнения кода выражения stmt .

Аргументы stmt и setup также могут содержать несколько операторов, разделенных ‘;’ или переводы строк, если они не содержат многострочных строковых литералов.

Параметры stmt и setup также могут принимать объекты, которые можно вызывать без аргументов. Обратите внимание, что временные издержки в этом случае немного больше из-за дополнительных вызовов функций.

Примеры:

Сравнение производительности трех различных выражений.

Чтобы предоставить модулю timeit доступ к определенным функциям в коде, можно передать параметр настройки, который содержит оператор импорта:

Другой вариант — передать функцию globals() аргументу globals , что приведет к выполнению кода в текущем глобальном пространстве имен. Это может быть удобнее, чем указание импорта:

Источник

Модуль timeit в Python, производительность фрагментов кода.

Модуль timeit предоставляет простой способ измерения времени выполнения (производительности) маленьких кусочков кода Python.

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

Примеры использования модуля timeit :

Использование интерфейса командной строки для сравнения производительности трех различных выражений.

То же самое, только достигнуто с помощью интерфейса Python:

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

Обратите внимание, что функция timeit.timeit() автоматически определяет количество повторений только при использовании интерфейса командной строки.

Можно предоставить оператор настройки -s , который выполняется только один раз в начале.

То же самое, только программно:

То же самое можно сделать с помощью класса timeit.Timer() и его методов:

В следующих примерах показано, как синхронизировать выражения, содержащие несколько строк. Здесь мы сравниваем стоимость использования функции hasattr() и try/except кроме проверки на отсутствие и представление атрибутов объекта.

То же самое, только программно:

Чтобы предоставить модулю timeit доступ к определенным функциям в коде, можно передать параметр настройки, который содержит оператор импорта:

Другой вариант — передать функцию globals() аргументу globals , что приведет к выполнению кода в текущем глобальном пространстве имен. Это может быть удобнее, чем указание импорта:

Источник