для чего нужен модуль timeit
Timeit в Python с примерами
Этот модуль предоставляет простой способ найти время выполнения маленьких битов кода Python.
Почему время?
Итак, теперь давайте начнем исследовать эту удобную библиотеку!
Функция модуля timeit.timeit (stmt, setup, timer, number) принимает четыре аргумента:
Где функция timeit.timeit () возвращает количество секунд, которое потребовалось для выполнения кода.
Пример 1
Давайте сначала посмотрим на основной пример.
# импорт необходимого модуля
# фрагмент кода выполняется только один раз
mysetup = «from math import sqrt»
# фрагмент кода, время выполнения которого нужно измерить
для х в диапазоне (100):
mylist.append (SQRT (х))
print timeit.timeit(setup = mysetup,
Пример 2
# импорт необходимых модулей
# функция двоичного поиска
def binary_search(mylist, find):
while len (mylist) > 0 :
mid = ( len (mylist)) / / 2
if mylist[mid] = = find:
mylist = mylist[mid + 1 :]
# функция линейного поиска
def linear_search(mylist, find):
# вычислить время двоичного поиска
из __main__ import binary_search
от случайного импорта randint » ‘
mylist = [x для x в диапазоне (10000)]
find = randint (0, len (mylist))
двоичный_поиск (mylist, find) » ‘
times = timeit.repeat(setup = SETUP_CODE,
# печать минимального исполнения. время
# вычислить время линейного поиска
из __main__ import linear_search
от случайного импорта randint » ‘
mylist = [x для x в диапазоне (10000)]
find = randint (0, len (mylist))
linear_search (mylist, найти)
times = timeit.repeat(setup = SETUP_CODE,
# печать минимального исполнения. время
if __name__ = = «__main__» :
Пример 3
Наконец, ниже я продемонстрирую, как вы можете использовать интерфейс командной строки модуля timeit :
Здесь я объясняю каждый термин в отдельности:
Итак, это было краткое, но краткое введение в модуль timeit и его практическое применение.
Это очень удобный инструмент для программистов на Python, когда им требуется быстрый взгляд на время выполнения их фрагментов кода.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
timeit — Измерение времени выполнения небольших фрагментов кода¶
Исходный код: Lib/timeit.py
Основные примеры¶
В следующем примере показано, как можно использовать интерфейс командной строки для сравнения трёх различных выражений:
Этого можно было достичь за счёт python интерфейса
Вызываемый также может быть передан из python интерфейса :
Однако timeit() автоматически определяет количество повторений только при использовании интерфейса командной строки. В разделе Примеры приведены дополнительные примеры.
Python Интерфейс¶
Модуль определяет три удобные функции и публичный класс:
Создать Timer сущность с переданным оператором, setup кодом и timer функцией с последующим запуском её методом timeit() с number выполнений. Необязательный аргумент globals указывает пространство имён для выполнения кода.
Изменено в версии 3.5: Добавлен необязательный параметр globals.
Создать Timer сущность с переданным оператором, setup кодом и timer функцией с последующим запуском её методом repeat() с заданным repeat счётчиком и number выполнений. Необязательный аргумент globals указывает пространство имён для выполнения кода.
Изменено в версии 3.5: Добавлен необязательный параметр globals.
Изменено в версии 3.7: По умолчанию значение repeat изменено с 3 на 5.
Изменено в версии 3.3: time.perf_counter() теперь является таймером по умолчанию.
Класс для замеров скорости выполнения небольших фрагментов кода.
Конструктор принимает оператор для синхронизации, дополнительный оператор используемый для настройки и функцию таймера. Оба оператора по умолчанию — ‘pass’ ; функция таймера зависит от платформы (см. doc string модуля). stmt и setup могут также содержать несколько операторов, разделенных ; или новыми строками, если они не содержат многострочных строковых литералов. По умолчанию оператор будет выполняться в пространстве имён timeit; этим поведением можно управлять путём передачи пространства имён в globals.
Время выполнения setup исключается из общего времени выполнения.
Изменено в версии 3.5: Добавлен необязательный параметр globals.
Время number выполнений основного оператора. При этом оператор установки выполняется один раз, а затем возвращает время, необходимое для выполнения основного оператора, несколько раз, измеренное в секундах как float. Аргумент — это число раз в цикле, по умолчанию равное одному миллиону. Главный оператор, оператор установки и используемая функция таймера передаются конструктору.
По умолчанию timeit() временно отключает сборщик мусора во время синхронизации. Преимущество этого подхода в том, что он делает независимые тайминги более сопоставимыми. Недостатком является то, что GC может быть важным компонентом эффективности измеряемой функции. Если это так, GC может быть повторно включен в качестве первого оператора в setup строке. Например:
Это удобная функция, которая вызывает timeit() повторно, так что общее время >= 0.2 секунды, возвращая возможное (количество циклов, время, занятое для этого числа циклов). Она вызывает timeit() с возрастающими числами из последовательности 1, 2, 5, 10, 20, 50, … пока время не составит не менее 0.2 секунды.
Добавлено в версии 3.6.
Вызов timeit() несколько раз.
Соблазнительно вычислить среднее и стандартное отклонение от вектора результата и сообщить об этом. Однако это не очень полезно. В типовом случае самое низкое значение даёт нижнюю границу для того, как быстро машина может запустить данный фрагмент код; более высокие значения вектора результата обычно вызваны не изменчивостью скорости Python’а, а другими процессами, мешающими точности синхронизации. Так что min() результата, наверное, единственное число, которое вас должно заинтересовать. После этого следует посмотреть на весь вектор и применить здравый смысл, а не статистику.
Изменено в версии 3.7: Значение repeat по умолчанию изменено с 3 на 5.
Помощник для печати трейсбэка из замеряемого кода.
Интерфейс командной строки¶
При вызове программы из командной строки используется следующая форма:
Далее приводится объяснение назначений опций:
сколько раз выполнить „statement“
сколько раз повторять таймер (по умолчанию 5)
оператор для выполнения один раз изначально (по умолчанию pass )
Добавлено в версии 3.3.
определяют единицу времени для вывода таймера; можно выбрать nsec, usec, msec или sec
Добавлено в версии 3.5.
печать необработанных результатов замеров; повтор для большей точности цифр
распечатать короткое сообщение об использовании и выйти из программы
Есть определенные базовые накладные расходы, связанные с выполнением оператора pass. Здесь код не пытается скрыть, но вы должны знать об этом. Базовые издержки могут быть измерены путём вызова программы без аргументов, и они могут отличаться между Python версиями.
Примеры¶
Можно предоставить оператор настройки, который выполняется только один раз в начале:
timeit — Measure execution time of small code snippets¶
Source code: Lib/timeit.py
This module provides a simple way to time small bits of Python code. It has both a Command-Line Interface as well as a callable one. It avoids a number of common traps for measuring execution times. See also Tim Peters’ introduction to the “Algorithms” chapter in the second edition of Python Cookbook, published by O’Reilly.
Basic ExamplesВ¶
The following example shows how the Command-Line Interface can be used to compare three different expressions:
This can be achieved from the Python Interface with:
A callable can also be passed from the Python Interface :
Note however that timeit() will automatically determine the number of repetitions only when the command-line interface is used. In the Examples section you can find more advanced examples.
Python InterfaceВ¶
The module defines three convenience functions and a public class:
Create a Timer instance with the given statement, setup code and timer function and run its timeit() method with number executions. The optional globals argument specifies a namespace in which to execute the code.
Changed in version 3.5: The optional globals parameter was added.
Create a Timer instance with the given statement, setup code and timer function and run its repeat() method with the given repeat count and number executions. The optional globals argument specifies a namespace in which to execute the code.
Changed in version 3.5: The optional globals parameter was added.
Changed in version 3.7: Default value of repeat changed from 3 to 5.
Changed in version 3.3: time.perf_counter() is now the default timer.
Class for timing execution speed of small code snippets.
The constructor takes a statement to be timed, an additional statement used for setup, and a timer function. Both statements default to ‘pass’ ; the timer function is platform-dependent (see the module doc string). stmt and setup may also contain multiple statements separated by ; or newlines, as long as they don’t contain multi-line string literals. The statement will by default be executed within timeit’s namespace; this behavior can be controlled by passing a namespace to globals.
To measure the execution time of the first statement, use the timeit() method. The repeat() and autorange() methods are convenience methods to call timeit() multiple times.
The execution time of setup is excluded from the overall timed execution run.
Changed in version 3.5: The optional globals parameter was added.
Time number executions of the main statement. This executes the setup statement once, and then returns the time it takes to execute the main statement a number of times, measured in seconds as a float. The argument is the number of times through the loop, defaulting to one million. The main statement, the setup statement and the timer function to be used are passed to the constructor.
By default, timeit() temporarily turns off garbage collection during the timing. The advantage of this approach is that it makes independent timings more comparable. The disadvantage is that GC may be an important component of the performance of the function being measured. If so, GC can be re-enabled as the first statement in the setup string. For example:
This is a convenience function that calls timeit() repeatedly so that the total time >= 0.2 second, returning the eventual (number of loops, time taken for that number of loops). It calls timeit() with increasing numbers from the sequence 1, 2, 5, 10, 20, 50, … until the time taken is at least 0.2 second.
It’s tempting to calculate mean and standard deviation from the result vector and report these. However, this is not very useful. In a typical case, the lowest value gives a lower bound for how fast your machine can run the given code snippet; higher values in the result vector are typically not caused by variability in Python’s speed, but by other processes interfering with your timing accuracy. So the min() of the result is probably the only number you should be interested in. After that, you should look at the entire vector and apply common sense rather than statistics.
Changed in version 3.7: Default value of repeat changed from 3 to 5.
Helper to print a traceback from the timed code.
Command-Line InterfaceВ¶
When called as a program from the command line, the following form is used:
Where the following options are understood:
how many times to execute вЂstatement’
how many times to repeat the timer (default 5)
statement to be executed once initially (default pass )
specify a time unit for timer output; can select nsec, usec, msec, or sec
print raw timing results; repeat for more digits precision
print a short usage message and exit
There is a certain baseline overhead associated with executing a pass statement. The code here doesn’t try to hide it, but you should be aware of it. The baseline overhead can be measured by invoking the program without arguments, and it might differ between Python versions.
ExamplesВ¶
It is possible to provide a setup statement that is executed only once at the beginning:
Как работает 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 для сравнения производительности различных функций.
Время для конкретной функции
Мы также можем рассчитать время выполнения определенной функции в сценарии, не выполняя другие блоки кода.
Модуль timeit в Python
Когда дело доходит до измерения времени выполнения фрагмента кода Python, у нас есть много идей. Как насчет простого использования модуля времени и экономии времени до и после выполнения программы? Звучит легко и хорошо, но это не так.
Когда программа выполняется, также запускаются многие фоновые процессы, чтобы сделать этот код исполняемым. Модуль времени не учитывает эти процессы. Если вам нужны точные измерения производительности времени, то модуль timeit – это то, что вам нужно.
Модуль timeit в Python запускает кусок кода 1 миллион раз (значение по умолчанию) и учитывает минимальное количество времени, которое потребовалось для запуска этого фрагмента кода. Давайте посмотрим, как работает модуль здесь.
Определение времени
Есть много способов использовать модуль timeit. Один из самых простых способов – использовать его непосредственно в CLI. Мы сделаем это в нашем первом примере, прежде чем перейти к другим примерам.
Пример
Мы начнем с использования модуля timeit непосредственно из интерфейса командной строки Python. Когда используется CLI, мы заметим, что модуль сам определяет количество повторений, выполняемых для одного и того же фрагмента кода. Вот примеры команд, которые мы выполнили для разных выражений:
Посмотрим на результат этой программы:
Выбор времени для фрагмента кода
Самое лучшее в модуле timeit – это то, что мы можем выбрать точный фрагмент кода, для которого мы хотим измерить производительность. Мы определим код установки и код для проверки производительности отдельно. Код установки запускается только один раз, тогда как основной код запускается 1 миллион раз:
Посмотрим на результат этой программы:
Обратите внимание, что лучше всего сохранить операторы импорта в самом коде установки, чтобы не вносить никаких изменений при выполнении основного кода.
Время записи для многострочного кода из CLI
Если создание сценария для вас неосуществимо и вы хотите быстро проверить код на его производительность, также можно использовать код непосредственно из интерфейса командной строки:
Посмотрим на результат этой программы:
Обычно сравнивают два блока кода
Если вам нужна действительно простая идея, сравнивая два фрагмента кода о том, насколько быстро один прогон формирует другой, есть довольно простой способ сделать это:
Просто используйте функцию default_timer(), чтобы запустить время и снова, чтобы найти для нее разницу. Это самый простой способ использовать модуль для определения производительности кода. Это также заставляет вас делать свой код в виде функций, которые являются модульными объектами.
Другой способ сделать то же самое, не касаясь исходного скрипта, скажем test.py, который содержит такие функции, как:
Используйте модуль timeit следующим образом:





