我想用Python的timeit模块做一些基准测试。有没有办法让timeit返回1000次循环中最慢和最快循环的时间?
答案 0 :(得分:1)
代码非常容易破解。您应该能够复制timeit.py
source code,将其保存到my_timeit.py
,稍加编辑,然后将其用作新模块。
您可以在line 326上看到timeit.py
best = min(r)
;您可以添加worst = max(r)
并编辑下面的打印报表。
答案 1 :(得分:1)
使用repeat功能代替timeit
,它会返回一个时间列表。
答案 2 :(得分:1)
timeit
返回“3的最佳值”,即有两个参数:一个指定循环中的迭代次数,另一个指定重复循环的次数。传递给min()
的结果是 per loop 的时间,而不是每次循环的迭代。
重复循环的目的是排除同一系统上其他进程的影响 - 来自文档(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()))