У меня довольно специфическая проблема. Я хочу измерить время выполнения цикла генератора (с ключевым словом 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
Как вы можете видеть, похоже, что задержка вне цикла как-то влияет на время выполнения самого цикла.
В чем причина такого поведения? Как я могу избежать этого несоответствия? Может быть, есть какой-то совершенно другой способ сделать то, чего я пытаюсь достичь?