Непоследовательные результаты при измерении времени выполнения отложенного цикла - PullRequest
0 голосов
/ 24 октября 2019

У меня довольно специфическая проблема. Я хочу измерить время выполнения цикла генератора (с ключевым словом yield). Однако я не знаю, через какие интервалы next() будет вызываться на этом генераторе. Это означает, что я не могу просто получить метку времени до и после цикла. Я думал, что получение отметки времени в начале и в конце каждой итерации поможет, но я получаю очень противоречивые результаты.

Вот код теста:

import time


def gen(n):
    total = 0
    for i in range(n):
        t1 = time.process_time_ns()
        # Something that takes time
        x = [i ** i for i in range(i)]
        t2 = time.process_time_ns()
        yield x
        total += t2 - t1
    print(total)


def main():
    for i in gen(100):
        pass

    for i in gen(100):
        time.sleep(0.001)

    for i in gen(100):
        time.sleep(0.01)


if __name__ == '__main__':
    main()

Типичный вывод для менявыглядит примерно так:

2151918
9970539
11581393

Как вы можете видеть, похоже, что задержка вне цикла как-то влияет на время выполнения самого цикла.

В чем причина такого поведения? Как я могу избежать этого несоответствия? Может быть, есть какой-то совершенно другой способ сделать то, чего я пытаюсь достичь?

1 Ответ

1 голос
/ 24 октября 2019

Вы можете переключать строки yield x и total += t2 - t1 только для подсчета времени, необходимого для создания x.

Подробнее об этом см. Также: Поведение Python "yield"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...