Прогнозировать оставшееся время цикла - PullRequest
0 голосов
/ 05 мая 2018

Добрый вечер,

Я пытаюсь оценить оставшихся времени до конца цикла; Я использовал:

start = datetime.now()
progress = 0

for i in range(1000): 

    #do a few calculations

    progress += 1

    stop = datetime.now()
    execution_time = stop-start 

    remaining = execution_time * ( 1000 - progress )

    print("Progress:", progress, "%, estimated", remaining, "time remaining")

Но он работает , а не , кажется, работает должным образом, поскольку он длится до нескольких минут, даже если цикл занимает всего 20 секунд, и быстро уменьшается при достижении конца.

Как я могу попытаться прогнозировать оставшиеся время цикла эффективно и правильно?

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Вместо использования datetime.datetime.now() для такого рода вещей вы можете использовать time.perf_counter(), который доступен в Python 3.3+. Из документов:

Возвращает значение (в долях секунды) счетчика производительности, то есть часы с максимально возможным разрешением для измерения короткого замыкания продолжительность. Это включает в себя время, прошедшее во время сна и общесистемный. Контрольная точка возвращаемого значения не определена, так что только разница между результатами последовательных звонков действителен.

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

from time import sleep, perf_counter

fmt = "  Progress: {:>3}% estimated {:>3}s remaining"
num = 1000

start = perf_counter()
for i in range(1, num + 1):
    # Simulate doing a few calculations
    sleep(0.01)

    stop = perf_counter()
    remaining = round((stop - start) * (num / i - 1))
    print(fmt.format(100 * i // num, remaining), end='\r')
print()

В зависимости от вашего терминала (и версии Python) вам также может понадобиться добавить ключевое слово flush=True arg к вызову print, чтобы получать отчеты о ходе печати по мере их выпуска.

0 голосов
/ 05 мая 2018

Я думаю, что в этой строке:

remaining = execution_time * ( 1000 - progress )

вам следует разделить execute_time / progress, потому что вы хотите знать, сколько времени занимает выполнение одного процента прогресса.

remaining = execution_time/progress * ( 1000 - progress )
0 голосов
/ 05 мая 2018

Ваш расчет оставшегося времени неверен. Если требуется execution_time для progress шагов. Тогда сколько нужно для 1000 шагов?

Простое умножение крестовины дает вам общее время. Вычтите это из прошедшего времени, и это даст вам оставшееся время.

remaining_time = execution_time * 1000 / progress - execution_time
percent_complete =  (progress  / 1000) * 100     #You can simplify this if you like
print("Progress:", percent_complete , "%, Estimated", remaining_time, "time remaining")

Также ваша переменная execution_time_1 никогда не определяется

...