python time timeit_关于python:尝试使用timeit.timeit

本问题已经有最佳答案,请猛点这里访问。

我想测量两个代码的运行时间,我尝试查找python文档的timeit,但我并不十分了解。

有人可以用更初级的词汇来解释吗?

另请参阅:cProfile

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

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

在命令行上,timeit进行适当的统计分析:它告诉您最短运行时间。这很好,因为所有计时错误都是正的。因此,最短的时间误差最小。没有办法得到负错误,因为计算机的计算速度永远不可能超过其计算速度!

因此,命令行界面:

%~> python -m timeit"1 + 2"

10000000 loops, best of 3: 0.0468 usec per loop

这很简单,是吗?

您可以设置以下内容:

%~> python -m timeit -s"x = range(10000)""sum(x)"

1000 loops, best of 3: 543 usec per loop

也是有用的!

如果需要多行,则可以使用外壳程序的自动延续或使用单独的参数:

%~> python -m timeit -s"x = range(10000)" -s"y = range(100)""sum(x)""min(y)"

1000 loops, best of 3: 554 usec per loop

这给出了一个设置

x = range(1000)

y = range(100)

和时代

sum(x)

min(y)

如果您想要更长的脚本,则可能会想移到Python脚本中的timeit。我建议避免这种情况,因为在命令行上分析和计时会更好。相反,我倾向于制作shell脚本:

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怎么办?

好吧,简单的方法是:

def function(...):

...

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

这样您就可以累积(而不是最短!)时间来运行该次数。

为了获得良好的分析效果,请使用.repeat并执行以下步骤:

min(timeit.Timer(function).repeat(repeat=REPEATS, number=NUMBER))

通常应将此与functools.partial而不是lambda: ...结合使用,以降低开销。因此,您可能会遇到以下情况:

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

您也可以:

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 loops, best of 3: 0.0476 usec per loop

好吧,它不是0.0476μs。您只知道它比这还少。所有错误均为正。

因此,尝试找到纯开销:

>>> python -m timeit -s"x = 0"""

100000000 loops, best of 3: 0.014 usec per loop

仅从定时开始,这就是30%的开销!这会大大歪曲相对的时间安排。但是您只真正关心添加的时间。 x的查找时间也需要包含在开销中:

>>> python -m timeit -s"x = 0""x"

100000000 loops, best of 3: 0.0166 usec per loop

差别不大,但是就在那里。

变异方法很危险。

python -m timeit -s"x = [0]*100000""while x: x.pop()"

10000000 loops, best of 3: 0.0436 usec per loop

但这是完全错误的! x是第一次迭代后的空白列表。您需要重新初始化:

>>> python -m timeit"x = [0]*100000""while x: x.pop()"

100 loops, best of 3: 9.79 msec per loop

但是那样您就会有很多开销。分别说明。

>>> python -m timeit"x = [0]*100000"

1000 loops, best of 3: 261 usec per loop

请注意,此处减去开销仅是合理的,因为开销仅占时间的一小部分。

我发现IPython的%timeit和%% timeit魔术函数比timeit.timeit更易于使用(尤其是在使用ipython笔记本时)。这里有几个例子。

>>>"-".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。使命令成为字符串,添加您要运行多少次。

>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=100)

0.011214537887298093

文档

这个文件真的难以理解吗?我觉得很清楚。

我的意思是:我不明白如何将其用于自己的功能代码类型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值