Jupyter笔记本

时间:2017-06-06 19:35:54

标签: python timeit

我在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

1 个答案:

答案 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语句或表达式。此功能既可以用作线条也可以用作单元格魔法:

     

在行模式下,您可以计算单行语句(尽管可以使用分号链接多个语句)。   在单元模式下,第一行中的语句用作设置代码(已执行但未定时),并且单元的主体是定时的。单元体可以访问在设置代码中创建的任何变量。