Time it гайд

Обновлено: 30.06.2024

Модуль предоставляет простой способ замера времени выполнения небольших фрагментов Python кода. Реализует как интерфейс командной строки , так и вызываемый интерфейс . Позволяет избежать ряда распространенных ловушек для измерения времени выполнения. См. также введение Тима Петерса в главе «Алгоритмы» Сборника рецептов Python, опубликованного в O’Reilly.

Основные примеры¶

В следующем примере показано, как можно использовать интерфейс командной строки для сравнения трёх различных выражений:

Этого можно было достичь за счёт python интерфейса

Вызываемый также может быть передан из python интерфейса :

Однако timeit() автоматически определяет количество повторений только при использовании интерфейса командной строки. В разделе Примеры приведены дополнительные примеры.

Python Интерфейс¶

Модуль определяет три удобные функции и публичный класс:

timeit. timeit ( stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None ) ¶

Создать Timer сущность с переданным оператором, setup кодом и timer функцией с последующим запуском её методом timeit() с number выполнений. Необязательный аргумент globals указывает пространство имён для выполнения кода.

Изменено в версии 3.5: Добавлен необязательный параметр globals.

timeit. repeat ( stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None ) ¶

Создать Timer сущность с переданным оператором, setup кодом и timer функцией с последующим запуском её методом repeat() с заданным repeat счётчиком и number выполнений. Необязательный аргумент globals указывает пространство имён для выполнения кода.

Изменено в версии 3.5: Добавлен необязательный параметр globals.

Изменено в версии 3.7: По умолчанию значение repeat изменено с 3 на 5.

timeit. default_timer ( ) ¶

Таймер по умолчанию, который всегда time.perf_counter() .

Изменено в версии 3.3: time.perf_counter() теперь является таймером по умолчанию.

class timeit. Timer ( stmt='pass', setup='pass', timer=<timer function>, globals=None ) ¶

Класс для замеров скорости выполнения небольших фрагментов кода.

Конструктор принимает оператор для синхронизации, дополнительный оператор используемый для настройки и функцию таймера. Оба оператора по умолчанию — 'pass' ; функция таймера зависит от платформы (см. doc string модуля). stmt и setup могут также содержать несколько операторов, разделенных ; или новыми строками, если они не содержат многострочных строковых литералов. По умолчанию оператор будет выполняться в пространстве имён timeit; этим поведением можно управлять путём передачи пространства имён в globals.

Для измерения времени выполнения первого оператора используйте метод timeit() . Методы repeat() и autorange() являются удобными способами многократного вызова timeit() .

Время выполнения setup исключается из общего времени выполнения.

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

Изменено в версии 3.5: Добавлен необязательный параметр globals.

timeit ( number=1000000 ) ¶

Время number выполнений основного оператора. При этом оператор установки выполняется один раз, а затем возвращает время, необходимое для выполнения основного оператора, несколько раз, измеренное в секундах как float. Аргумент — это число раз в цикле, по умолчанию равное одному миллиону. Главный оператор, оператор установки и используемая функция таймера передаются конструктору.

По умолчанию timeit() временно отключает сборщик мусора во время синхронизации. Преимущество этого подхода в том, что он делает независимые тайминги более сопоставимыми. Недостатком является то, что GC может быть важным компонентом эффективности измеряемой функции. Если это так, GC может быть повторно включен в качестве первого оператора в setup строке. Например:

autorange ( callback=None ) ¶

Автоматически определяет количество вызовов timeit() .

Это удобная функция, которая вызывает timeit() повторно, так что общее время >= 0.2 секунды, возвращая возможное (количество циклов, время, занятое для этого числа циклов). Она вызывает timeit() с возрастающими числами из последовательности 1, 2, 5, 10, 20, 50, … пока время не составит не менее 0.2 секунды.

Если callback передано и не None , то будет вызываться после каждого пробного с двумя аргументами: callback(number, time_taken) .

Добавлено в версии 3.6.

repeat ( repeat=5, number=1000000 ) ¶

Вызов timeit() несколько раз.

Это удобная функция, которая вызывает timeit() повторно, возвращая список результатов. Первый аргумент указывает количество вызовов timeit() . Второй аргумент указывает number аргумент для timeit() .

Соблазнительно вычислить среднее и стандартное отклонение от вектора результата и сообщить об этом. Однако это не очень полезно. В типовом случае самое низкое значение даёт нижнюю границу для того, как быстро машина может запустить данный фрагмент код; более высокие значения вектора результата обычно вызваны не изменчивостью скорости Python’а, а другими процессами, мешающими точности синхронизации. Так что min() результата, наверное, единственное число, которое вас должно заинтересовать. После этого следует посмотреть на весь вектор и применить здравый смысл, а не статистику.

Изменено в версии 3.7: Значение repeat по умолчанию изменено с 3 на 5.

print_exc ( file=None ) ¶

Помощник для печати трейсбэка из замеряемого кода.

Преимущество по сравнению со стандартным трейсбэком заключается в том, что в скомпилированном шаблоне отображаются исходные строки. Необязательный аргумент file указывает место отправки трейсбэк; значение по умолчанию — sys.stderr .

Интерфейс командной строки¶

При вызове программы из командной строки используется следующая форма:

Далее приводится объяснение назначений опций:

сколько раз выполнить „statement“

сколько раз повторять таймер (по умолчанию 5)

оператор для выполнения один раз изначально (по умолчанию pass )

измерить время процесса, а не время обхода, используя time.process_time() вместо time.perf_counter() , что является значением по умолчанию

Добавлено в версии 3.3.

определяют единицу времени для вывода таймера; можно выбрать nsec, usec, msec или sec

Добавлено в версии 3.5.

-v , --verbose ¶

печать необработанных результатов замеров; повтор для большей точности цифр

Многострочный оператор может быть задан путём указания каждой строки в качестве отдельного аргумента оператора; строки с отступами можно заключить в кавычки и использовать начальные пробелы. Несколько опций -s обрабатываются одинаково.

Если -n не дано, подходящее количество циклов вычисляется путём попытки увеличения чисел из последовательности 1, 2, 5, 10, 20, 50,… пока общее время не составит по меньшей мере 0.2 секунды.

default_timer() измерения могут быть затронуты другими программами, работающими на той же машине, поэтому лучше всего, когда необходимо точное время, повторить время несколько раз и использовать лучшее время. Опция -r хороша для этого; по умолчанию 5 повторов, вероятно, достаточно в большинстве случаев. Для измерения времени ЦПУ можно использовать time.process_time() .

Есть определенные базовые накладные расходы, связанные с выполнением оператора pass. Здесь код не пытается скрыть, но вы должны знать об этом. Базовые издержки могут быть измерены путём вызова программы без аргументов, и они могут отличаться между Python версиями.

Примеры¶

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

Когда дело доходит до измерения времени выполнения фрагмента кода Python, у нас есть много идей. Как насчет простого использования модуля времени и экономии времени до и после выполнения программы? Звучит легко и хорошо, но это не так.

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

Модуль timeit в Python запускает кусок кода 1 миллион раз (значение по умолчанию) и учитывает минимальное количество времени, которое потребовалось для запуска этого фрагмента кода. Давайте посмотрим, как работает модуль здесь.

Содержание

Определение времени

Есть много способов использовать модуль timeit. Один из самых простых способов – использовать его непосредственно в CLI. Мы сделаем это в нашем первом примере, прежде чем перейти к другим примерам.

Пример

Мы начнем с использования модуля timeit непосредственно из интерфейса командной строки Python. Когда используется CLI, мы заметим, что модуль сам определяет количество повторений, выполняемых для одного и того же фрагмента кода. Вот примеры команд, которые мы выполнили для разных выражений:

Посмотрим на результат этой программы:

Определение времени выполнения из CLI

Выбор времени для фрагмента кода

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

Посмотрим на результат этой программы:

Базовый цикл отсчета времени

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

Время записи для многострочного кода из CLI

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

Посмотрим на результат этой программы:

Синхронизация многострочного кода в CLI

Обычно сравнивают два блока кода

Если вам нужна действительно простая идея, сравнивая два фрагмента кода о том, насколько быстро один прогон формирует другой, есть довольно простой способ сделать это:

Просто используйте функцию default_timer(), чтобы запустить время и снова, чтобы найти для нее разницу. Это самый простой способ использовать модуль для определения производительности кода. Это также заставляет вас делать свой код в виде функций, которые являются модульными объектами.

Tame It!

Tame It! — это игра в жанре симулятор и выживание, разрабатываемая Manka Games для платформы PC. Стилистика в игре, к сожалению, не определена, а выделить особенности можно следующие: симулятор свиданий, выживание, point amp click, 2d, смешная, решения с последствиями, нагота, крафтинг, беседы, романтика, цветастая, приключение, стилизация, расслабляющая, для одного игрока, хентай, строительство базы, для взрослых, сексуальный контент, nsfw, достижения steam. Вам будут доступны такие игровые режимы как «для одного игрока».

Во всем мире игра Tame It! будет распространяться по модели разовая покупка издателем Manka Games. На данный момент стадия игры — в разработке. Бесплатно скачать Tame It!, в том числе и через торрент, нельзя, поскольку игра распространяется по модели разовая покупка. Игра поддерживает русский язык.

MMO13 еще не вынес Tame It! оценку. Игра распространяется в магазине Steam, пользователи которого еще не оставили отзывов.

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

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

Python модуль Timeit

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

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

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

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

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

Timeit Cli По Умолчанию

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

Timeit пример

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также: