Сообщить об ошибке.

Функция timeit() модуля timeit в Python

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

Синтаксис:

import timeit

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

Параметры:

  • stmt='pass' - проверяемый код,
  • setup='pass' - настройка кода,
  • timer=<default timer> - используемый таймер,
  • number=1000000 - число циклов измерений,
  • globals=None - область видимости.

Возвращаемое значение:

  • float время выполнения кода в цикле number раз.

Описание:

Функция timeit() модуля timeit возвращает время, необходимое для выполнения основного выражения number количество раз. Для этого создает экземпляр timeit.Timer() с заданным выражением stmt, кодом настройки setup и функцией таймера timer и запускает его метод Timer.timeit() с заданным number числом выполнений в цикле.

Необязательный аргумент globals указывает пространство имен для выполнения кода выражения stmt.

Аргументы stmt и setup также могут содержать несколько операторов, разделенных ';' или переводы строк, если они не содержат многострочных строковых литералов.

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

Примеры:

Сравнение производительности трех различных выражений.

>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.3018611848820001
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.2727368790656328
>>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
0.23702679807320237

Чтобы предоставить модулю timeit доступ к определенным функциям в коде, можно передать параметр настройки, который содержит оператор импорта:

def test():
    """Stupid test function"""
    L = [i for i in range(100)]

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))

Другой вариант - передать функцию globals() аргументу globals, что приведет к выполнению кода в текущем глобальном пространстве имен. Это может быть удобнее, чем указание импорта:

def f(x):
    return x**2
def g(x):
    return x**4
def h(x):
    return x**8

import timeit
print(timeit.timeit('[func(42) for func in (f,g,h)]', globals=globals()))

# 0.7024806049994368

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

>>> import timeit
>>> timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
# 0.7002408580010524