- Модуль timeit в Python
- Определение времени
- Пример
- Выбор времени для фрагмента кода
- Время записи для многострочного кода из CLI
- Обычно сравнивают два блока кода
- Как работает timeit в Python?
- Python timeit — интерфейс командной строки
- Использование модуля
- Сравните производительность блоков кода
- Время для конкретной функции
- Как измерить время выполнения функции в Python
- Использование модуля time
- Использование функции time.perf_counter
- Использование функции time.process_time
- Использование модуля timeit
- Использование декораторов для измерения времени выполнения
- Заключение
Модуль timeit в Python
Когда дело доходит до измерения времени выполнения фрагмента кода Python, у нас есть много идей. Как насчет простого использования модуля времени и экономии времени до и после выполнения программы? Звучит легко и хорошо, но это не так.
Когда программа выполняется, также запускаются многие фоновые процессы, чтобы сделать этот код исполняемым. Модуль времени не учитывает эти процессы. Если вам нужны точные измерения производительности времени, то модуль timeit – это то, что вам нужно.
Модуль timeit в Python запускает кусок кода 1 миллион раз (значение по умолчанию) и учитывает минимальное количество времени, которое потребовалось для запуска этого фрагмента кода. Давайте посмотрим, как работает модуль здесь.
Определение времени
Есть много способов использовать модуль timeit. Один из самых простых способов – использовать его непосредственно в CLI. Мы сделаем это в нашем первом примере, прежде чем перейти к другим примерам.
Пример
Мы начнем с использования модуля timeit непосредственно из интерфейса командной строки Python. Когда используется CLI, мы заметим, что модуль сам определяет количество повторений, выполняемых для одного и того же фрагмента кода. Вот примеры команд, которые мы выполнили для разных выражений:
$ python -m timeit '"-".join(str(n) for n in range(100))' $ python -m timeit '"-".join([str(n) for n in range(100)])' $ python -m timeit '"-".join(map(str, range(100)))'
Посмотрим на результат этой программы:
Выбор времени для фрагмента кода
Самое лучшее в модуле timeit – это то, что мы можем выбрать точный фрагмент кода, для которого мы хотим измерить производительность. Мы определим код установки и код для проверки производительности отдельно. Код установки запускается только один раз, тогда как основной код запускается 1 миллион раз:
import timeit # setup code is executed just once mysetup = "from math import sqrt" # main code snippet for performance check mycode = ''' def example(): mylist = [] for x in range(100): mylist.append(sqrt(x)) ''' # timeit statement print(timeit.timeit(setup = mysetup, stmt = mycode, number = 10000))
Посмотрим на результат этой программы:
Обратите внимание, что лучше всего сохранить операторы импорта в самом коде установки, чтобы не вносить никаких изменений при выполнении основного кода.
Время записи для многострочного кода из CLI
Если создание сценария для вас неосуществимо и вы хотите быстро проверить код на его производительность, также можно использовать код непосредственно из интерфейса командной строки:
$ python3 -m timeit -s \ > "jd = <>" \ > "for idx in range(1000):" \ > " jd[str(idx)] = idx"
Посмотрим на результат этой программы:
Обычно сравнивают два блока кода
Если вам нужна действительно простая идея, сравнивая два фрагмента кода о том, насколько быстро один прогон формирует другой, есть довольно простой способ сделать это:
import timeit start_time = timeit.default_timer() func1() print(timeit.default_timer() - start_time) start_time = timeit.default_timer() func2() print(timeit.default_timer() - start_time)
Просто используйте функцию default_timer(), чтобы запустить время и снова, чтобы найти для нее разницу. Это самый простой способ использовать модуль для определения производительности кода. Это также заставляет вас делать свой код в виде функций, которые являются модульными объектами.
Другой способ сделать то же самое, не касаясь исходного скрипта, скажем test.py, который содержит такие функции, как:
def RadixSort(): . def TimSort(): .
Используйте модуль timeit следующим образом:
$ python -m timeit -s 'import test' 'test.RadixSort()' $ python -m timeit -s 'import test' 'test.TimSort()'
Как работает timeit в Python?
Модуль Python timeit — это простой интерфейс для быстрого измерения времени выполнения небольших блоков кода.
Когда вы создаете приложение, вы можете задаться вопросом, как этот блок кода будет работать, и захотите протестировать его в различных сценариях.
Для этого модуль timeit предоставляет очень простое решение этой проблемы. Давайте посмотрим, как мы можем использовать это для синхронизации наших фрагментов кода.
Мы рассмотрим как интерфейс командной строки, так и вызываемый интерфейс.
Python timeit — интерфейс командной строки
Интерфейс командной строки очень похож на интерфейс запуска программы Python.
Вам необходимо импортировать внешний модуль timeit с помощью опции -m и применить его к вашему коду.
python -m timeit 'print("Hello from AskPython")'
Это запустит фрагмент, переданный в виде строки, с использованием timeit .
По умолчанию это будет запускать код 1 миллион раз в Linux и 20 миллионов раз в Windows и измерять лучшее время среди этих значений. Ниже приведены результаты моей системы Linux.
Обратите внимание, что если у вас уже есть цикл for в вашем фрагменте, модуль гарантирует, что общее количество итераций близко к 1 миллиону, поэтому весь ваш цикл не будет выполняться 1 миллион раз.
Мы также можем использовать timeit через интерпретатор Python и импортировать его, используя:
Чтобы узнать время выполнения, передайте код в виде строки в timeit.timeit() .
execution_time = timeit.timeit(code, number)
Мы можем контролировать количество итераций с помощью параметра number .
>>> import timeit >>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) 0.19053685299877543 >>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000) 0.172546762998536 >>> timeit.timeit('"-".join(map(str, range(100)))', number=10000) 0.13625987299747067 >>>
Использование модуля
Давайте теперь посмотрим, как мы можем использовать timeit для timeit времени сниппета внутри нашей программы.
Что, если ваш код требует предварительной настройки? А если вам тоже нужно импортировать определенные модули?
Что ж, решение этой проблемы — использовать блок кода настройки, который выполнит всю необходимую работу по настройке всех необходимых модулей и переменных.
Написать блок настройки очень просто. Вы просто пишете любой код, который вам нужен, и передаете его в виде строки в переменную.
После этого вы можете написать свой основной блок кода и передать его timeit.timeit() , используя параметры setup и stmt .
execution_time = timeit.timeit(setup = setup_code, stmt = main_block, number = 100)
timeit гарантирует, что настройка будет выполнена до измерения вашего основного цикла, поэтому он выполняется только один раз.
Этот код пытается получить все подмассивы из начального элемента массива numpy. Обратите внимание, что блок настройки запускается только один раз.
import timeit # Setup is run only once setup_code = ''' import numpy as np a = np.arange(0, 1000) print(a.shape) def print_subarrays(a): op = [] for i in range(a.shape[0]): op.append(a[:i]) ''' main_block = ''' print_subarrays(a) ''' # Main Block is run 1000 times print('Best execution Time among 1000 iterations:', timeit.timeit(setup=setup_code, stmt=main_block, number=1000))
(1000,) Best execution Time among 1000 iterations: 0.3830194959991786
Сравните производительность блоков кода
Мы можем легко сравнить производительность нескольких блоков кода с помощью timeit .
Мы будем использовать для этой цели таймер, используя timeit.default_timer() .
Время, затрачиваемое на блок кода, будет текущим временем минус начальное время, взятое за эталон, которое вы можете передавать через переменные.
import timeit start_time = timeit.default_timer() function_1() time_1 = timeit.default_timer() - start_time start_time = timeit.default_timer() function_2() time_2 = timeit.default_timer() - start_time print('Function 1 took', time_1) print('Function 2 took', time_2)
Давайте протестируем 2 функции в массиве numpy range() и np.arange() и посмотрим, как они сравниваются.
import timeit import numpy as np def time_range(size): for i in range(size): pass def time_arange(size): np.arange(size) if __name__ == '__main__': # For smaller arrays print('Array size: 1000') start_time = timeit.default_timer(); time_range(1000) range_time_1 = timeit.default_timer() - start_time start_time = timeit.default_timer(); time_arange(1000) arange_time_1 = timeit.default_timer() - start_time # For large arrays print('Array size: 1000000') start_time = timeit.default_timer(); time_range(1000000) range_time_2 = timeit.default_timer() - start_time start_time = timeit.default_timer(); time_arange(1000000) arange_time_2 = timeit.default_timer() - start_time print(f'size 1000: range() took ') print(f'size 1000: arange() took ') print(f'size 1000000: range() took ') print(f'size 1000000: arange() took ')
Array size: 1000 Array size: 1000000 size 1000: range() took 2.2970001737121493e-05 size 1000: arange() took 8.393999451072887e-06 size 1000000: range() took 0.02567379199899733 size 1000000: arange() took 0.0031752489994687494
Таким образом, мы могли легко использовать timeit для сравнения производительности различных функций.
Время для конкретной функции
Мы также можем рассчитать время выполнения определенной функции в сценарии, не выполняя другие блоки кода.
Если предыдущий файл назывался numpy_compare.py, мы можем узнать время выполнения, используя следующий вызов:
python -m timeit -s 'import numpy_compare' 'numpy_compare.time_range(1000)'
Как измерить время выполнения функции в Python
Оптимизация и профилирование кода требуют от программистов умения измерять время выполнения отдельных функций. Это помогает выявить узкие места в коде и делает оптимизацию более целенаправленной. В этой статье мы рассмотрим различные подходы к измерению времени выполнения функции в Python.
Использование модуля time
Одним из наиболее прямых способов измерить время выполнения функции в Python является использование модуля time . Приведем пример его использования:
import time def my_func(): for _ in range(1000000): pass start_time = time.time() my_func() end_time = time.time() print(f"Функция выполнилась за секунд.")
Функция time.time() возвращает текущее время в секундах, прошедшее с начала эпохи (обычно это 00:00 1 января 1970 года).
Использование функции time.perf_counter
Функция time.perf_counter() представляет собой более точную альтернативу time.time() . Она измеряет время с максимально возможной точностью для вашей платформы.
import time def my_func(): for _ in range(1000000): pass start_time = time.perf_counter() my_func() end_time = time.perf_counter() print(f"Функция выполнилась за секунд.")
Использование функции time.process_time
Функция time.process_time() измеряет время процессора, вместо реального времени. Это может быть полезно для измерения времени выполнения функции, которое не зависит от других процессов в системе.
import time def my_func(): for _ in range(1000000): pass start_time = time.process_time() my_func() end_time = time.process_time() print(f"Функция выполнилась за секунд.")
Использование модуля timeit
Модуль timeit в Python предоставляет мощный и гибкий способ измерения времени выполнения небольших фрагментов кода. Он предназначен для избежания некоторых общих ловушек при измерении времени выполнения.
import timeit def my_func(): for _ in range(1000000): pass execution_time = timeit.timeit(my_func, number=1000) print(f"Функция выполнилась за секунд.")
Функция timeit.timeit() принимает два аргумента: функцию для выполнения и количество раз, которое нужно выполнить эту функцию.
Использование декораторов для измерения времени выполнения
Иногда может быть полезно создать декоратор для измерения времени выполнения функции. Это особенно полезно, если вам нужно измерить время выполнения многих функций.
import time def timer_decorator(func): def wrapper(*args, **kwargs): start_time = time.perf_counter() result = func(*args, **kwargs) end_time = time.perf_counter() print(f"Функция выполнилась за секунд.") return result return wrapper @timer_decorator def my_func(): for _ in range(1000000): pass my_func()
Заключение
Измерение времени выполнения функции в Python — важный навык для любого разработчика. Будь то простое использование модуля time , использование функций с большей точностью, таких как time.perf_counter() , или более сложные инструменты, такие как модуль timeit и декораторы, Python предлагает множество вариантов для решения этой задачи. Использование этих инструментов может помочь вам сделать ваш код более эффективным и быстрым.
Основные методы подсчета пробелов в строке в Python
Функция sorted() в Python: синтаксис, описание и примеры использования
Функция slice() в Python: создание объекта среза, представляющий набор индексов, заданных диапазоном
Создаем итератор с помощью функции iter() в Python
Основные способы добавления элементов в список Python
Функция memoryview() в Python: представления памяти