Время прочтения: 3 мин.
Индикаторы для определения степени выполнения работы скрипта или отдельной функции можно выделить в класс, который называется Progress Bar.
Progress Bar реализованы практически во всех языках программирования, но на Python-е внедрить такой индикатор максимально просто.
Наиболее распространённые модули называются: tqdm, progress и alive-progress.
Для примера выполнения каких-либо действий мы будем использовать модуль time, и показывать циклом отсчитывание секунд.
Для начала подключим модуль progress и time. После этого реализуем простой отчет до 10. Так как мы будем работать в командной строке, то используем компонент IncrementalBar модуля progress, который нам позволит отчитывать действия. Ниже представлен простой код и визуализация работы.
import time
from progress.bar import IncrementalBar
bar = IncrementalBar(`Countdown`, max = 10)
for i in range(10):
bar.next()
time.sleep(1)
bar.finish()
В итоге, при работе скрипта вы видим следующее:
Алгоритм предельно прост: сначала создаем переменную, в которой указываем имя Progress Bar-а и максимальное значение, а потом каждый раз увеличиваем ее методом next() на одно значение. В конце, для получения конечной информации о работе указываем метод finish().
При этом модуль progress содержит не только IncrementalBar, но и более 15 различных вариантов визуализации.
При использовании модуля tqdm нам надо его только добавить и использовать как один из параметров цикла. При этом данный модуль имеет больше опций чем progress, доступен для использования в jupyter notebook, а также достаточно информативен.
import time
from tqdm import tqdm
for i in tqdm(range(10)):
time.sleep(1)
Результат работы при этом следующий:
Как можно заметить, даже без каких-либо настроек tqdm показывает нам время выполнения и за сколько выполняется один цикл (что очень удобно).
Последним вариантом реализации Progress Bar, который мы рассмотрим, будет модуль alive-progress.
В самом простом исполнении он похож на tqdm, но отображает чуть больше анимации в консоли.
Для его работы надо не только использовать модуль alive_progress, но и конструкцию with as (этот вариант наиболее простой, но не обязательный). Кроме этого, во время каждой итерации цикла нам надо вызывать bar(), чтобы увеличить значение progress bar.
import time
from alive_bar(10) as bar:
for I in range(10):
bar()
time.sleep(1)
Видим, что информации стало еще больше
Данные модули имеют крайне большое и разнообразное количество функций, которые позволяют сделать работу в консоли более информативной и понятной для пользователя. А также дать нам информацию о том, как быстро работает программа, сколько еще отработать осталось, и не завис ли скрипт.