以 int 范围作为函数参数的 Timeit

Timeit with range of int as parameter for function

我想用范围为 (0,30) 作为参数的 timeit 来比较函数的执行时间,所以我可以将每个调用的执行时间与不同的参数存储在一个列表中。 此重复函数调用(默认情况下)函数 5 次,而不是返回所有参数 0 到 30

的时间
times = timeit.repeat("for x in range(30): foo(x)", "from __main__ import foo",
                      number=100)

那么如何将参数传递给函数并获取每个参数的执行时间?

这是一个例子:

from time import sleep
from timeit import timeit


def foo(x):
    sleep(1/(x+1))


n = 1
print(list([timeit(lambda: foo(x), number=n) / n] for x in range(30)))

结果:

[[1.0116304], [0.5029303], [0.34732699999999994], [0.2513573], etc.]

它 运行s timeit foo(0),然后 foo(1),等等。它 运行s 它 n 次(你可以将其设置为 100) 并将结果除以 n 以获得每个 运行 平均花费的时间。

list() 在那里,因为它只会在那里打印生成器对象,否则 - 方括号也可以。

我认为 lambda: 是您想要的部分。它允许您传入要传入的参数,而不必更改 timeit 的调用方式,因为 timeit 期望传入要调用的函数,因此您不能传入 foo(x)(因为那只会评估为 None,函数结果)。