使用IPython魔法命令%%timeit时无法获取定义变量的问题
解决IPython中
%%timeit代码块变量无法外部访问的问题 这是个新手用%%timeit时很容易踩的坑,我来给你理清楚原因和解决办法:
为什么会出现这个问题?
%%timeit的设计初衷是精准测量代码的执行耗时,为了避免外部环境变量干扰计时结果,同时它会自动重复运行代码块很多次(比如你看到的100000000 loops),所以默认会把代码块放在一个隔离的临时命名空间里执行,执行完就销毁这个空间,自然不会把变量泄露到全局环境中——这就是为什么你之后调用var会报NameError。
几种解决方案
根据你的需求不同,有几个办法可以选:
1. 换用%time(非批量计时)
如果你只是想知道这段代码的大致耗时,同时需要保留变量,直接用单行的%time魔法命令就行,它会在当前全局命名空间执行代码:
%time var = 30
执行完后var就会存在于全局环境里,随时可以调用。
2. 让%%timeit使用全局命名空间
如果必须用%%timeit的多轮平均计时,又要保留变量,可以通过参数让代码块共享全局命名空间,同时减少运行次数(避免重复赋值多次):
%%timeit -n 1 -r 1 globals() var = 30
-n 1:每次运行只执行1次循环-r 1:只运行1轮测试globals():指定代码块使用当前全局命名空间
这样计时完成后,var就会留在全局环境里,缺点是只跑一次的计时结果精度会低一些,适合你需要兼顾计时和变量保留的场景。
3. 在代码块中声明全局变量
另一种方式是在%%timeit的代码块里用global关键字显式声明变量为全局变量:
%%timeit global var var = 30
这种方式下%%timeit还是会重复运行代码块,但每次都会把var赋值到全局空间,最后你得到的var是最后一次赋值的结果(这里都是30,所以没问题),计时结果也能保持精准。
总结
- 只需要精准计时,不需要保留变量:用默认的
%%timeit就行 - 需要保留变量,对计时精度要求不高:用
%time - 既要精准计时又要保留变量:选上面的方案2或3
内容的提问来源于stack exchange,提问作者RadRuss
相关产品推荐
相关产品推荐

