首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用timeit.timeit

尝试使用timeit.timeit
EN

Stack Overflow用户
提问于 2013-09-21 17:14:58
回答 3查看 3.1K关注 0票数 1

我想测量两段代码的运行时间,我试着查找python文档中的timeit,但我并没有真正理解。有人能用更初级的词汇来解释吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-21 17:33:09

注意:复制到如何使用timeit模块

我将告诉您一个秘密:使用timeit的最佳方式是在命令行上。

在命令行上,timeit进行适当的统计分析:它告诉您最短的运行时间。这是好的,因为所有的错误在计时是积极的。所以最短的时间内误差最小。没有办法得到负错误,因为计算机不能计算得比它能计算的更快!

因此,命令行接口:

代码语言:javascript
复制
%~> python -m timeit "1 + 2"
10000000 loops, best of 3: 0.0468 usec per loop

这很简单,嗯?

你可以设置一些东西:

代码语言:javascript
复制
%~> python -m timeit -s "x = range(10000)" "sum(x)"
1000 loops, best of 3: 543 usec per loop

这也很有用!

如果需要多行,可以使用shell的自动延续或使用单独的参数:

代码语言:javascript
复制
%~> python -m timeit -s "x = range(10000)" -s "y = range(100)" "sum(x)" "min(y)"
1000 loops, best of 3: 554 usec per loop

给出了一个设置

代码语言:javascript
复制
x = range(1000)
y = range(100)

和时代

代码语言:javascript
复制
sum(x)
min(y)

如果您想拥有更长的脚本,您可能会倾向于在Python中迁移到timeit。我建议避免这样做,因为在命令行上分析和计时更好。相反,我倾向于编写shell脚本:

代码语言:javascript
复制
 SETUP="

 ... # lots of stuff

 "

 echo Minmod arr1
 python -m timeit -s "$SETUP" "Minmod(arr1)"

 echo pure_minmod arr1
 python -m timeit -s "$SETUP" "pure_minmod(arr1)"

 echo better_minmod arr1
 python -m timeit -s "$SETUP" "better_minmod(arr1)"

 ... etc

由于多次初始化,这可能会花费更长的时间,但通常这并不是什么大问题。

但是,如果您想在模块中使用timeit呢?

好吧,简单的方法是:

代码语言:javascript
复制
def function(...):
    ...

timeit.Timer(function).timeit(number=NUMBER)

这给你累积的(不是最小的!)是时候运行那么多次了。

为了得到一个好的分析,使用.repeat并取这一分钟:

代码语言:javascript
复制
min(timeit.Timer(function).repeat(repeat=REPEATS, number=NUMBER))

您通常应该将其与functools.partial而不是lambda: ...结合起来,以降低开销。因此,您可以拥有如下内容:

代码语言:javascript
复制
from functools import partial

def to_time(items):
    ...

test_items = [1, 2, 3] * 100
times = timeit.Timer(partial(to_time, test_items)).repeat(3, 1000)

# Divide by the number of repeats
time_taken = min(times) / 1000

你也可以:

代码语言:javascript
复制
timeit.timeit("...", setup="from __main__ import ...", number=NUMBER)

这将给您提供更接近界面的命令行,但以一种不那么酷的方式。"from __main__ import ..."允许您在由timeit创建的人工环境中使用主模块中的代码。

值得注意的是,这是一个方便的Timer(...).timeit(...)包装,所以不是特别好的时机。如上面所示,我个人更喜欢使用Timer

警告

有几个警告与timeit在任何地方都适用。

  • 间接费用未计算在内。假设您想要计时x += 1,以了解加法所需的时间:python -m timeit -s "x = 0“"x += 1”10000000循环,最好每循环3: 0.0476 嗯,不是0.0476秒。你只知道它比那小。所有的错误都是肯定的。 因此,尝试找到纯粹的开销: python -m timeit -s "x = 0“100000000循环,每个循环最佳值为3: 0.014 这是一个很好的30%的开销只是从时间!这可能会极大地扭曲相对时间。但是,您只关心添加时间;x的查找时间也需要包含在开销中: python -m timeit -s "x = 0“"x”100000000循环,最好每循环3: 0.0166 差别并不大,但它是存在的。
  • 变异的方法是危险的。 python -m timeit -s "x = *100000“,而x: x.pop()”10000000循环“,每个循环3: 0.0436 但是这是完全错误的!x是第一次迭代之后的空列表。您需要重新初始化:python -m timeit "x = *100000“而x: x.pop()”100个循环“,最好是每循环3: 9.79msec 但是你的开销很大。单独解释一下。 "x = *100000“1000个循环,最好每循环3: 261个-m。 请注意,在这里减去开销是合理的,因为开销只是时间的一小部分。
票数 3
EN

Stack Overflow用户

发布于 2013-09-21 22:21:24

我发现ipython的%timeit和%%timeit魔术函数比timeit.timeit更容易使用(特别是在使用ipython笔记本时)。举几个例子,这里

票数 1
EN

Stack Overflow用户

发布于 2013-09-21 17:21:57

代码语言:javascript
复制
>>> "-".join(str(n) for n in range(100))
'0-1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-40-41-42-43-44-45-46-47-48-49-50-51-52-53-54-55-56-57-58-59-60-61-62-63-64-65-66-67-68-69-70-71-72-73-74-75-76-77-78-79-80-81-82-83-84-85-86-87-88-89-90-91-92-93-94-95-96-97-98-99'
>>> 

假设这是您想要运行的命令。

导入timeit。将命令设置为字符串,添加要运行它的次数。

代码语言:javascript
复制
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=100)
0.011214537887298093

文档

这个医生真的很难理解吗?我发现它很清晰。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18935360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档