Python 3.x 使用magic命令%%timeit-n1-r1会导致jupyter不保留局部变量的值
我刚注意到一件很奇怪的事。当我使用Python 3.x 使用magic命令%%timeit-n1-r1会导致jupyter不保留局部变量的值,python-3.x,jupyter-notebook,jupyter-lab,Python 3.x,Jupyter Notebook,Jupyter Lab,我刚注意到一件很奇怪的事。当我使用%%timeit-n1-r1magic命令来测量Jupyter lab中代码块的执行时间时,python不会在执行该块后保留局部变量的值! 例如,如果我运行包含以下代码的代码块: for i in range(10): for j in range(10): d = i - j 然后在另一个块中运行print(d),jupyter将显示上一次迭代中d的值。 但如果我运行这段代码: %%timeit -n1 -r1 for in in ran
%%timeit-n1-r1
magic命令来测量Jupyter lab中代码块的执行时间时,python不会在执行该块后保留局部变量的值!
例如,如果我运行包含以下代码的代码块:
for i in range(10):
for j in range(10):
d = i - j
然后在另一个块中运行print(d)
,jupyter将显示上一次迭代中d的值。
但如果我运行这段代码:
%%timeit -n1 -r1
for in in range(10):
for j in range(10):
d = i - j
然后运行print(d)
,juoyter会向我显示一条错误消息:
NameError: name 'd' is not defined
这种奇怪行为背后的原因是什么 IPython/Jupyter获取单元格中的代码块,并在一个函数中运行它,该函数的作用域对于
\uuuu main\uuuu
模块的命名空间不可见。从这个角度来看,它似乎把细胞当作一根弦:
In [4]: get_ipython().magic('timeit 1 + 2')
11.2 ns ± 0.167 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
In [5]: %%timeit
...: 1 + 2
...:
...:
11.1 ns ± 0.17 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
无论IPython函数运行什么,循环中的变量都是已知的,并且对循环进行计时,但是在Timer
实例方法之外是不可访问的
当您在单元格(或普通Python交互式解释器)中运行范围(10)内的
for i循环(不含%%timeit
)时,Python处理for循环的方式是在循环的每次迭代中动态地重新分配i
、j
和d
值。在循环运行完之后,它们仍然会坐在\uuuu main\uuuuuuu
(这是Python shell中的\uuu name\uuuuuuuuu
dunder属性)的名称空间中。对于in-in-range(10):
对于i-in-range(10):
?@Hoog,对不起,这是一个输入错误!我刚刚纠正了这一点,我不仅需要解释,还需要解决这个问题。