gpt4 book ai didi

python-3.x - 使用魔术命令 %% timeit -n1 -r1 导致 jupyter 不保留局部变量的值

转载 作者:行者123 更新时间:2023-12-01 04:30:07 26 4
gpt4 key购买 nike

我刚刚注意到一些非常奇怪的事情。当我使用 %%timeit -n1 -r1魔术命令,在Jupyter实验室测量一个代码块的执行时间,python在执行该 block 后不保留局部变量的值!
例如,如果我运行包含以下代码的代码块:

for i in range(10):
for j in range(10):
d = i - j

然后运行 ​​ print(d)在另一个 block 中,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 获取单元格中的代码块并在其范围对您的__main__ 不可见的函数中运行它。模块的命名空间。从this answer来看,它似乎将单元格作为一个字符串:

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 之外无法访问。实例方法。

当您运行 for i in range(10)在单元格(或仅在普通 Python 交互式解释器中)循环(没有 %%timeit ),Python 处理 for 循环的方式是动态重新分配 i , j , 和 d循环的每次迭代中的值。他们仍然会在 __main__ 的命名空间中待着。 (这是 Python shell 中的 __name__ dunder 属性)在循环运行之后。

关于python-3.x - 使用魔术命令 %% timeit -n1 -r1 导致 jupyter 不保留局部变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54922775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com