Вопрос по performance, time, python, python-3.x – время против времени

25

Иногда мне нравится время, которое требуется для выполнения части моего кода. Я'Мы проверили много онлайн-сайтов и увидели два основных способа сделать это. Один используетtime.time а другой использует.timeit.timeit

Итак, я написал очень простой скрипт для сравнения двух:

from timeit import timeit
from time import time
start = time()
for i in range(100): print('ABC')
print(time()-start, timeit("for i in range(100): print('ABC')", number=1))

В основном, это время, сколько нужно, чтобы напечатать "ABC» 100 раз за цикл. Число слева это результаты дляtime.time и число справа для:timeit.timeit

# First run
0.0 0.012654680972022981
# Second run
0.031000137329101562 0.012747430190149865
# Another run
0.0 0.011262325239660349
# Another run
0.016000032424926758 0.012740166697164025
# Another run
0.016000032424926758 0.0440628627381413

Как видите, иногда time.time быстрее, а иногдамедленнее. Какой способ лучше (точнее)?

timeit лучший выбор для временных отрезков кода. Оно использует (time.time()time.clock() для Windows) и отключает сборщик мусора. Кроме того, одно испытание нена самом деле достаточно. Blender
@Blender:timeit использованияtime.perf_counter в Python 3.3+ jfs
@ J.F.Sebastian: Спасибо, я нене знаю этого. Blender

Ваш Ответ

1   ответ
45

timeit является более точным по трем причинам:

Он повторяет тесты много раз, чтобы исключить влияние других задач на вашем компьютере, таких как очистка диска и планирование ОС.он отключает сборщик мусора, чтобы предотвратить искажение результатов этим процессом, запланировав запуск сбора в неподходящий момент.он выбирает наиболее точный таймер для вашей ОС,time.time или жеtime.clock в Python 2 иtime.perf_counter() на Python 3. см.timeit.default_timer
@Catbuilts: это 'снемного сложнее, чем это, но не много. Martijn Pieters
@Annan: зачем изобретать это колесо? Я'Я уверен, что любой вариант использования, который вы можете придумать, при условии, что вы понимаете, что значит запускать что-то повторно, может быть предоставленtimeit, Есть несколько небольших мелких хитростейtimeit использует (например, используяitertools.repeat(None, repetitioncount) для диапазона повторения с низким коэффициентом трения), который выЯ должен был повторить тоже, если вы хотите быть какточный» какtimeit получает. Martijn Pieters
Если вы явно делаете эти три вещи, вы получаете результаты так же точно, как и время? Мой пример использования - запуск множества тестов с разными входами, так что, возможно, было бы легче обойтись без этого времени. Annan
@MartijnPieters: ямне интересно, если%timeit это встроенная магическая команда дляtimeit, как насчет%time, Является%time то же самое, когда мы используемtime.clock() (поместите 2 time.clock в начало и конец кода и рассчитайте разницу во времени). Я'читаю здесь, но недостаточно информацииipython.readthedocs.io/en/stable/interactive/magics.html , Спасибо Catbuilts

Похожие вопросы