python中的%timeit是什么?


96

我总是像这样阅读代码来计算时间:

%timeit function()

您能在这里解释什么是“%”吗?

我认为,“%”总是用于替换字符串中的某些内容,例如%s表示替换字符串,%d替换数据,但是我不知道这种情况。


16
这是来自iPython的神奇命令。请参阅:iPython Magics
MrAlexBailey 2015年

Answers:


91

%timeitipython的魔术函数,可用于计时特定代码段(单个执行语句或单个方法)。

从文档:

%timeit

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

要使用它,例如,如果我们想确定using是否xrange比using更快range,则只需执行以下操作:

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

您将获得他们的时间安排。

主要优点%timeit是:

  • 不必timeit.timeit 从标准库中导入代码,也可以多次运行代码以找出哪种方法更好。

  • %timeit将基于总共2秒的执行窗口自动计算代码所需的运行次数。

  • 您还可以使用当前的控制台变量,而无需传递整个代码片段,以防timeit.timeit构建在另一个可以正常工作的环境中构建的变量。


1
有没有一种方法可以从ipython shell计时宏或一组行?
alpha_989

2
@ alpha_989是的,您可以将这些行集合包装在一个函数中,然后对函数计时,例如:%timeit function()
mu无

@mu无:请澄清timer.timeit-这是实际的模块名称吗?
水源


输出10000 loops, best of 3: 29.6 µs per loop可以解释为:(1.)将表达式运行10000次以获取总时间(2.),然后将总时间除以10000以获取“每个循环”时间,并且(3.)完成总时间计算总共3次​​,最后3次(4.),将最小总时间(也称为“ 3个最佳”)用作输出。我的解释正确吗,是/否?
Trevor Boyd Smith

37

这就是所谓的一系魔法中的IPython。它们的独特之处在于其参数仅扩展到当前行的末尾,而魔术本身的确是为命令行开发而构造的。 timeit用于定时执行代码。

如果您想查看所有可以使用的魔法,只需键入:

%lsmagic

以获得线魔术和细胞魔术的列表。

从文档的某些其它神奇信息在这里

IPython具有一个称为魔术的命令系统,该系统有效地提供了一种迷你命令语言,该语言与Python的语法正交,并且可由用户使用新命令进行扩展。魔术应该以交互方式键入,因此它们使用命令行约定,例如使用空格分隔参数,使用破折号表示选项以及命令行环境中的其他典型约定。

根据您是处于模式还是单元格模式,有两种不同的使用方法%timeit。您的问题说明了第一种方式:

In [1]: %timeit range(100)

In [1]: %%timeit 
      : x = range(100)
      :


2

我只想添加另一个有用的优点,即使用%timeit通过mu无应答

  • 也可以使用当前的控制台变量,而无需像timeit.timeit那样传递整个代码片段,以构建在timeit可以工作的另一个环境中构建的变量。

PS:我知道这应该是上面回答的评论,但是我目前对此没有足够的声誉,希望我写的内容对某人有帮助,并帮助我赢得足够的声誉,以便下次发表评论。


1
您也可以编辑其他人的答案以改善答案。您应该已经为此拥有足够的声誉
Tarick Welling

谢谢不知道。@TarickWelling
Ankit Agrawal,

2

我只是想添加一个关于%% timeit的非常微妙的观点。如果它在单元上运行“魔术” ,您将得到错误...

UsageError:%%timeit找不到行魔术函数

...如果%% timeit上方有任何代码/注释行。换句话说,请确保%% timeit是单元格中的第一个命令。

我知道这是所有专家都不会说的一个小问题,但是我只是想为年轻的巫师们以魔术开始增加我的半分钱。


1
这不适用于iPython Shell,仅适用于Jupyter笔记本
snakecharmerb,

0

行魔法前缀与的性格和工作很像OS命令行调用:他们得到作为参数的行,其中参数都没有括号或引号传递的其余部分。单元魔术%%作为双前缀,并且它们是函数,它们不仅作为该行的其余部分作为参数,而且还作为单独的参数作为其下方的行的参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.