2

我知道我可以像这样使用 timeit:

timeit.timeit("f(x)", "from __main__ import f", number=100000)

这将重复f()100000 次。

但是,我想做这样的事情:

timeit.timeit("f()", "from __main__ import f", duration=5000)

这将f()尽可能多地重复,直到达到 5 秒。

在timeit中是否有类似的东西,或者我必须自己制作一个 while 循环?

4

2 回答 2

0

不,没有这样的选择。查看这个未解决的问题

这是在 中完成的timeit.main,当您运行类似的东西时会调用它python -m timeit ...(仅包括此处的相关部分):

if number == 0:
    # determine number so that 0.2 <= total time < 2.0
    for i in range(1, 10):
        number = 10**i
        try:
            x = t.timeit(number)
        except:
            t.print_exc()
            return 1
        if verbose:
            print "%d loops -> %.*g secs" % (number, precision, x)
        if x >= 0.2:
            break

您可以轻松地将其修改为在“total_time”之后停止。

于 2014-04-22T17:10:19.240 回答
0

从命令行运行时,

python -mtimeit -s'from script import f, x' 'f(x)'

timeit脚本找到调用该函数至少 0.2 秒所需的迭代次数。Endolith 已将该代码合并为一个函数:

def timeit_auto(stmt="pass", setup="pass", repeat=3, duration=0.2):
    """
    https://stackoverflow.com/q/19062202/190597 (endolith)
    Imitate default behavior when timeit is run as a script.

    Runs enough loops so that total execution time is greater than 0.2 sec,
    and then repeats that 3 times and keeps the lowest value.

    Returns the number of loops and the time for each loop in microseconds
    """
    t = timeit.Timer(stmt, setup)

    # determine number so that 0.2 <= total time < 2.0
    for i in range(1, 10):
        number = 10 ** i
        x = t.timeit(number)  # seconds
        if x >= duration:
            break
    r = t.repeat(repeat, number)
    best = min(r)
    usec = best * 1e6 / number
    return number, usec

标准库中的timeit 代码可以在这里找到。

于 2014-04-22T17:10:44.253 回答