Волшебная функция timeit

Я использую волшебную функцию %%timeit, чтобы получить время, необходимое для выполнения некоторого кода. Меня беспокоит то, что когда я запускаю %%timeit, я не получаю результатов. Например:

a=5
b=3

%%timeit
c = a + b

Теперь, если я хочу использовать c в следующей ячейке, я получаю, что c не определено.

print(c)
>>>NameError: name 'c' is not defined

Не могли бы вы помочь мне понять, почему это происходит, почему c не сохраняется, когда в этой конкретной ячейке используется волшебная функция %%timeit?


person MarcoQ    schedule 07.03.2016    source источник
comment
Клетка? Ты имеешь в виду линию? Заявление? Переменная?   -  person deceze♦    schedule 07.03.2016
comment
Ах, похоже, вы говорите об IPython...!?   -  person deceze♦    schedule 07.03.2016
comment
Да, я должен был пояснить, что использую IPython/Jupyter с python 3.5.   -  person MarcoQ    schedule 07.03.2016


Ответы (2)


Когда вы кодируете время с помощью %%timeit, код, который вы предоставляете, выполняется в отдельном пространстве имен, поэтому его эффекты не видны в вашей среде.

person holdenweb    schedule 07.03.2016
comment
Хорошо, я вижу, что это другое пространство имен, но я не уверен, что понимаю почему, какая от него польза? Смысл написания c=a+b заключался в том, чтобы вычислить c. Почему он должен был перенести его в другое пространство имен, чтобы я не получил результат? - person MarcoQ; 07.03.2016
comment
Вам нужно прочитать код библиотеки timeit, чтобы получить такой уровень детализации - я могу сказать вам, что происходит, но не почему. - person holdenweb; 07.03.2016
comment
timeit может запускать ваш код много раз, даже тысячи раз. В вашем примере я получаю 10000000 loops, best of 3: 55.6 ns per loop. Обычно я запускаю выражение один раз, чтобы проверить значение, а затем использую timeit для проверки производительности. - person hpaulj; 08.03.2016

сотовый режим:

%%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code code code...

В режиме ячейки оператор в первой строке используется как код установки (выполняется, но не синхронизируется), а тело ячейки синхронизируется. Тело ячейки имеет доступ к любым переменным, созданным в коде установки.

https://ipython.org/ipython-doc/3/interactive/magics.html#magic-timeit

Вы выполняете в режиме ячейки, а строка — это просто код установки; что означает, что на самом деле он не рассчитан по времени, и его результаты доступны только для кода ячейки, следующего за ним.

person deceze♦    schedule 07.03.2016