我在Python 3.6中使用了Jupyter笔记本。如果你想以最简单的方式使用timeit()
进行快速测试,似乎在大多数情况下,如果你将它用作单元格中的唯一一行并在其中放入一个函数调用,它就可以工作,如:
timeit(raiseTo600(6623))
如果你在命令的同一个单元格中添加了多个注释,就会出现错误,这就是为什么被调用的函数在前一个单元格中定义的(将它放在同一个单元格中,然后出现错误) 。
即使这种行为(它起作用的地方)也不是100%一致的。随机地,可能会发生错误并清除它们,您必须重新启动内核然后再次运行。
我在网上看到的例子在timeit()
内接受了多个函数调用(引号内的多行代码)。我想在代码的单元格中添加注释,并认为因为我得到的注释错误是timeit无法识别,可能包括import语句会修复它。但尝试这样做会再次触发错误:
代码:
from timeit import timeit
timeit(raiseTo600(6623))
输出:
ValueError: stmt is neither a string nor callable
将它放在引号内会产生此错误,即使该函数在前一个单元格中运行并且工作正常。修改后的代码:
from timeit import timeit
timeit('raiseTo600(6623)')
输出:
NameError: name 'raiseTo600' is not defined
这应该很简单。这里出了什么问题?
我已经使用多个功能对此进行了测试并得到了相同的症状,但为了完整起见,这是我试图用来解决为什么timeit()
无效的简单方法:
def raiseTo600(x):
return x**600
答案 0 :(得分:0)
在Jupyter笔记本中,最好使用内置的%%timeit
魔法:
In [1]:
%%timeit -n 1000 def raiseTo600(x): return x**600
raiseTo600(6623)
Out [1]:
7.59 µs ± 699 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
单元格的第一行已执行,但未定时。您可以为timeit
设置标志和/或运行设置代码(例如定义您的功能)。然后将细胞的主体循环并定时。
来自Jupyter docs:
%timeit Python语句或表达式的执行时间
用法,在行模式下:
%timeit [-n -r [-t | -c] -q -p -o]声明
或在单元格模式下:
%% timeit [-n -r [-t | -c] -q -p -o] setup_code
码
...代码
使用timeit模块执行Python语句或表达式。此功能既可以用作线条也可以用作单元格魔法:
在行模式下,您可以计算单行语句(尽管可以使用分号链接多个语句)。 在单元模式下,第一行中的语句用作设置代码(已执行但未定时),并且单元的主体是定时的。单元体可以访问在设置代码中创建的任何变量。