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