[Перевод] Отслеживаем прогресс выполнения в Python

Индикаторы прогресса (progress bar) — визуальное отображение процесса работы. Они избавляют нас от необходимости беспокоиться о том, не завис ли скрипт, дают интуитивное представление о скорости его выполнения и подсказывают, сколько времени осталось до завершения.

Человек ранее не использовавший индикаторы прогресса может предположить, что их внедрение может сильно усложнить код. К счастью, это не так. Небольшие примеры ниже покажут, как быстро и просто начать отслеживать прогресс в консоли или в интерфейсе быстро набирающей популярность графической библиотеки PySimpleGUI.

Первым у нас идёт модуль Progress.

Всё, что от вас потребуется, это указать количество ожидаемых итераций, тип индикатора и вызывать функцию при каждой итерации:

import time
from progress.bar import IncrementalBar

mylist = [1,2,3,4,5,6,7,8]

bar = IncrementalBar('Countdown', max = len(mylist))

for item in mylist:
    bar.next()
    time.sleep(1)

bar.finish()

Результат работы:


f8956066bc8771df24f3b195b73e9fb1.gif

Есть индикаторы на любой вкус:


4660af83f239a7d8e1f14a02fb8ed13d.gif

Следующей на очереди идёт библиотека tqdm.


Быстрый и расширяемый индикатор прогресса для Python и CLI

Всего один вызов функции понадобится для получения результата аналогичного предыдущему:

import time
from tqdm import tqdm

mylist = [1,2,3,4,5,6,7,8]

for i in tqdm(mylist):
    time.sleep(1)

Получаем:


77a31bde39a1237549def40677d7d653.gif

Само собой, в комплекте идёт куча настроек и опций.

Ещё один вариант синтаксиса, побольше дефолтных анимаций, чем в предыдущих примерах:

from alive_progress import alive_bar
import time

mylist = [1,2,3,4,5,6,7,8]

with alive_bar(len(mylist)) as bar:
    for i in mylist:
        bar()
        time.sleep(1)

Результат:


c605292a0763b239ae950fc4fff0bfec.gif

Иногда возникает необходимость предоставить конечному пользователю графический индикатор.


f8afd770b2c1c74dfac23dd492c686f5.gif

Сколько кода нужно, чтобы достигнуть такого результата? Немного:

import PySimpleGUI as sg
import time

mylist = [1,2,3,4,5,6,7,8]

for i, item in enumerate(mylist):
    sg.one_line_progress_meter('This is my progress meter!', i+1, len(mylist), '-key-')
    time.sleep(1)

Рассмотрим реализацию индикатора в PySimpleGUI.


580d8d0a3e852ec2ef74db199755f2f6.gif

Вот как это сделать:

import PySimpleGUI as sg
import time

mylist = [1,2,3,4,5,6,7,8]

progressbar = [
    [sg.ProgressBar(len(mylist), orientation='h', size=(51, 10), key='progressbar')]
]
outputwin = [
    [sg.Output(size=(78,20))]
]

layout = [
    [sg.Frame('Progress',layout= progressbar)],
    [sg.Frame('Output', layout = outputwin)],
    [sg.Submit('Start'),sg.Cancel()]
]

window = sg.Window('Custom Progress Meter', layout)
progress_bar = window['progressbar']

while True:
    event, values = window.read(timeout=10)
    if event == 'Cancel'  or event is None:
        break
    elif event == 'Start':
        for i,item in enumerate(mylist):
            print(item)
            time.sleep(1)
            progress_bar.UpdateBar(i + 1)

window.close()

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

© Habrahabr.ru