Измерьте время обработки с помощью модуля timeit в Python.

Бизнес

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

Здесь будут рассмотрены следующие два случая.

  • Измерение в файле Python:timeit.timeit(),timeit.repeat()
  • Измерения с помощью Jupyter Notebook:%timeit,%%timeit

Другой способ — использовать time.time() для измерения прошедшего времени в программе.

Измерения в файлах Python: timeit.timeit(), timeit.repeat()

В качестве примера мы измерим время обработки простой функции test(n), которая вычисляет сумму n последовательных чисел.

import timeit

def test(n):
    return sum(range(n))

n = 10000
loop = 1000

result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842

Если вы передадите в функцию timeit.timeit() код, который хотите измерить, в виде строки, он будет выполнен ЧИСЛО раз и будет возвращено время, которое он занял.
Значение по умолчанию для числа — 1 000 000. Обратите внимание, что если вы используете значение по умолчанию для трудоемкого процесса, он займет много времени.

Передавая globals() в качестве аргумента globals, код будет выполняться в глобальном пространстве имен.
Без этого функция test и переменная n не будут распознаны в приведенном выше примере.

Задаваемый код может быть не строкой, а вызываемым объектом, поэтому его можно задать в виде лямбда-выражения без аргументов; в этом случае аргумент globals указывать не нужно.

result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287

Единицей измерения результата являются секунды. Здесь результат — это время обработки за одно выполнение, деленное на количество выполнений.

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

print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038

Используя функцию timeit.repeat(), timeit() можно выполнять многократно. Результат будет получен в виде списка.

repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]

Измерения с помощью Jupyter Notebook:%timeit, %%timeit

В Jupyter Notebook (IPython) можно использовать следующие магические команды; импортировать модуль timeit не требуется.

  • %timeit
  • %%timeit

%timeit

В %timeit укажите целевой код, разделенный пробелом, как аргументы командной строки.

По умолчанию число и повтор в timeit.timeit() определяются автоматически. Вы также можете указать их с помощью опций -n и -r.

Результаты рассчитываются как среднее значение и стандартное отклонение.

%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

%%timeit

Волшебная команда %%timeit может быть использована для измерения времени обработки всей ячейки.

В качестве примера запустим тот же процесс с помощью NumPy. Опции -n и -r можно опустить.

Поскольку мы измеряем время обработки всей ячейки, следующий пример включает время на импорт NumPy.

%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

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