Почему магическая функция ipython `% timeit -n1 code_block` выполняет` code_block` несколько раз?

1

Я пытаюсь выполнить конкретный тест несколько раз в 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.

Вопросы:

  1. Почему существуют 2 разных способа запуска code_block с использованием -n<N> и -r<R>?
  2. В чем разница между -n<N> и -r<R> и почему это необходимо?
Теги:
ipython
timeit

1 ответ

1
Лучший ответ

Эти параметры также находятся в модуле 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   
  • 0
    Спасибо за ответ .. на самом деле я проверял модуль timeit в python а также перед публикацией ... и видел это .. Мне было интересно, почему нужно иметь 2 разных параметра -n и -r , почему бы просто не иметь 1? Я проверю код, который вы упомянули более подробно, чтобы увидеть, есть ли разница ..
  • 0
    Я поиграл с функцией, которую вы упомянули. Дополнительный вопрос. При использовании просто -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
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню