Виміряйте час обробки за допомогою модуля timeit Python.

Бізнес

Використовуючи модуль timeit стандартної бібліотеки Python, ви можете легко виміряти час виконання процесу у своєму коді. Це корисно для швидкої перевірки.

Тут будуть розглянуті два наступні випадки.

  • Вимірювання у файлі Python:timeit.timeit(),timeit.repeat()
  • Вимірювання за допомогою ноутбука Jupyter:%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, код буде виконуватися в глобальному просторі імен.
Без цього тест функції та змінна n не розпізнаються у наведеному вище прикладі.

Код, який потрібно вказати, може бути викликаним об’єктом замість рядка, тому його можна вказати як лямбда-вираз без аргументів; у цьому випадку глобальні аргументи вказувати не потрібно.

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:%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 на початку комірки, тому це найпростіше використовувати.