timeit模块 - 获取最快和最慢的循环

3

我想使用Python的timeit模块进行一些基准测试。是否有一种方法可以使timeit返回1000个循环中最慢和最快循环的时间?

4个回答

3
timeit返回"3次中最好的",即有两个参数:一个指定循环中的迭代次数,另一个指定要重复循环的次数。传递给min()的结果是每个循环的时间,而不是每个循环迭代的时间。
重复循环的目的是排除同一系统上其他进程的影响--来自文档(help('timeit')):
引用:

当需要准确计时时,最好的方法是多次重复计时并使用最佳时间。对于此,选项-r很好;在大多数情况下,默认的3次重复可能已足够。

重复测量1000次没有意义。您可能想要为单个循环指定1000个迭代(默认值为1000000)。
只有最快的循环(最小时间)才有用--来自help('timeit.Timer.repeat')
引用:

注意: 计算结果向量的平均值和标准差并报告这些值是很诱人的。然而,这并不是非常有用的。在典型情况下,最低值为您的机器运行给定代码片段的速度提供了一个下限;结果向量中的较高值通常不是由Python速度的变化引起的,而是由其他进程干扰您的时间精度引起的。因此,结果的min()可能是您唯一感兴趣的数字。之后,您应该查看整个向量并运用常识而不是统计学。强调是我的

即,最慢的循环指示其他进程如何干扰测量。
#!/usr/bin/env python
import timeit

def your_function():
    "do something"

t = timeit.Timer(your_function)
# repeat 10 times, 1000000 times through the loop
repeat, number = 10, 1000000
r = t.repeat(repeat, number) 
best, worse = min(r), max(r)
print("{number} loops, best of {repeat}: {best:.3g} seconds per loop, "
     "worse of {repeat}: {worse:.3g} seconds per loop".format(**vars()))

2

使用repeat函数代替timeit,该函数返回时间列表。


1
代码很容易被篡改。您应该能够复制timeit.py源代码,将其保存为my_timeit.py,稍微编辑一下,然后将其用作新模块。
您可以在第326行看到timeit.py执行best = min(r); 您可以添加worst = max(r)并编辑下面的打印语句。

0

使用timeit.repeat怎么样?

res = timeit.repeat('"-".join(str(n) for n in range(1000))', number=1, repeat=10)

fastest = min(res)
slowest = max(res)

如果您想要多次执行(比如说 n 次)以进行每次重复,请不要忘记将结果除以 n
n = 100
res = timeit.repeat('"-".join(str(n) for n in range(1000))', number=n, repeat=10)

fastest = min(res)/n
slowest = max(res)/n

print(fastest, slowest)
# Out:
# 0.00020186356006888674 0.0002322985901264474

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接