Я пытаюсь выполнить конкретный тест несколько раз в ipython
используя магическую функцию %timeit
. Для демонстрационных целей я просто использую -n1
вместо -n3
здесь и пользуюсь простой функцией print(1)
.
%%timeit
и %timeit
говорит следующее:
Options: -n<N>: execute the given statement <N> times in a loop. If this
value is not given, a fitting value is chosen.
-r<R>: repeat the loop iteration <R> times and take the best result.
Default: 3 (the 3 here is a typo in ipython, for which I have submitted a
PR)
Однако, если я сделаю следующее:
%%timeit -n1
print(1)
или же
%timeit -n1 print(1)
он на самом деле печатает 1
7 раз подряд следующим образом
In[1]: %timeit -n1 print(1)
1
1
1
1
1
1
1
32.8 µs ± 38.7 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Я ожидал, что из-за определения времени %%timeit
/%timeit
он будет запускать cell
или code
только один раз.
Я прочитал это сообщение: qaru.site/questions/1270327/... котором приводятся некоторые примеры того, как работает %%timeit
и фактический исходный код функции ipython
magic %%timeit
здесь: https://github.com/ipython/ipython/blob/ec3d1a11bf26a0962cb2cf55ba263b12ac023183/IPython/core/magics/execution.py#L944
где они определяют 2 типа циклов: 1) -n<N>
и 2) -r<R>
.
Если я просто использую -n1
, кажется, что он также предполагает, что я использовал -r7
, то есть -n1
умолчанию -n1 -r7
. Это означает, что, хотя я хочу, чтобы он выполнялся ровно за один проход, он все равно будет запускать code_block
7 раз по https://github.com/ipython/ipython/blob/ec3d1a11bf26a0962cb2cf55ba263b12ac023183/IPython/core/magics/execution.py # L1021, если я также не -n1 -r1
.
code_block
с использованием -n<N>
и -r<R>
?-n<N>
и -r<R>
и почему это необходимо?Эти параметры также находятся в модуле timeit.
-n
определяет, сколько раз вы запускаете функцию (или блок или что-то еще) внутри временного окна. Так начинается секундомер, код запускается n
раз, затем секундомер заканчивается. Вы должны запускать его достаточно много раз, чтобы результаты были значимыми (timeit
умолчанию timeit
значениям от 10 до 0,2 секунд).-r
определяет, сколько из этих повторений (где повторение "таймер запуска, запуск n раз, таймер остановки"), вы должны сделать. Всегда есть некоторая ошибка из-за того, что ваш процессор планирует другие процессы и т.д., Поэтому обычно вы хотите запустить его несколько раз и самое лучшее значение этих r
раз. (timeit
умолчанию - 3, а комментарии в источнике, который вы указали, указывают на то, что ipython делает то же самое - но фактический код может не совпадать). В псевдо-питоне вы можете увидеть, как n
и r
влияют на процесс синхронизации:
time_hist = []
for _ in range(r):
t0 = time.now() # Start stopwatch (.now() is not a real function)
for _ in range(n):
# <your code block>
t1 = time.now() # Stop stopwatch
time_hist.append(t1 - t0) # Append time delta
return min(time_hist) # Return the min of the r deltas
timeit
вpython
а также перед публикацией ... и видел это .. Мне было интересно, почему нужно иметь 2 разных параметра-n
и-r
, почему бы просто не иметь 1? Я проверю код, который вы упомянули более подробно, чтобы увидеть, есть ли разница ..-n
основная причина, по которой вы можете получить разные значения при запуске одной и той же функции / кода, заключается в том, что базовая система может вести себя немного иначе, чем Я бегу к другому. Чтобы компенсировать это, мы можем использовать-n
так, чтобы общее время составляло ~ 0,2 с или выше. Это имеет смысл. Это также заботится и учитывает тот факт, чтоCPU may be scheduling other processes, or there may be network connections or you need to access the hard-disk which may be in use by something else