Время за указанный период времени

Я знаю, что могу использовать timeit вот так:

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

И это повторится f() 100000 раз.

Тем не менее, я хотел бы сделать что-то вроде этого:

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

Который будет повторяться f() столько, сколько нужно, пока не достигнет 5 секунд.

Есть ли что-то подобное во времени, или мне придется самому создать цикл времени?

2 ответа

Нет, такой опции нет. Проверьте этот открытый вопрос.

Вот как это делается в 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".

При запуске из командной строки,

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

timeit Скрипт находит количество итераций, необходимое для вызова функции не менее 0,2 секунды. Эндолит объединил этот код в функцию:

def timeit_auto(stmt="pass", setup="pass", repeat=3, duration=0.2):
    """
    https://stackru.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

Код времени в стандартной библиотеке можно найти здесь.

Другие вопросы по тегам