Tqdm python что это
Перейти к содержимому

Tqdm python что это

  • автор:

Пишем прогресс-бары при помощи tqdm

В переводе с арабского tqdm (taqadum) означает прогресс; библиотека с таким названием используется как раз для создания индикаторов прогресса. Просто оберните любой итерируемый объект в функцию – tqdm(iterable) – и готово.

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

pip install tqdm

А теперь без лишних разговоров берите копируйте код ниже, запускайте у себя и любуйтесь. Библиотека tqdm помимо, собственно, самого прогресс-бара, показывает также количество итераций, время, затраченное на выполнение цикла, и частоту итераций в секунду. Видели ли вы что-то прекраснее сегодня?

from tqdm import tqdm for i in tqdm(range(10000)): pass
100%|��������������������| 10000/10000 [00:00

Ладно, давайте теперь научимся настраивать наши индикаторы и использовать при обработке датафреймов. Заодно узнаем о некоторых дополнительных фичах библиотеки.

tqdm и функции

В примере ниже мы создали функцию fun , которая принимает целое число x и исполняется с задержкой в x секунд. Потом мы обернули tqdm вокруг функции range , которая будет запускать цикл на 10 итераций. Для выполнения первой итерации потребуется 0 секунд. Вторая итерация займет 1 секунду, и так далее. Для завершения цикла потребовалось 45 секунд, и мы при этом видим анимированный индикатор выполнения.

from tqdm import trange, tqdm from time import sleep # функция с задержкой исполнения def fun(x): sleep(x) return x # цикл с прогресс-баром for i in tqdm(range(10)): fun(i)
100%|██████████| 10/10 [00:45

tqdm.notebook в списке

А здесь будем использовать модуль tqdm.notebook для отображения прогресс-баров в Jupyter Notebook с помощью виджетов Ipython.

Сначала создаём простой список различных цветов. Затем с помощью цикла выведем их названия одно за другим с задержкой в одну секунду. Заворачиваем список в модуль, и радуемся анимированному индикатору.

from tqdm.notebook import tqdm colors = ["Blue", "Green", "Yellow", "White", "Gray", "Black"] for x in tqdm(colors): sleep(1) print(x)

Несколько индикаторов выполнения

С помощью вложенных циклов напишем несколько прогресс-баров, имитирующих визуализацию хода обучения модели машинного обучения.

  • trange – это комбинация из функции tqdm , обёрнутой вокруг функции range .
  • Внешний цикл будет выполняться за 10 итераций с задержкой 0,01 сек.
  • desc используется для обозначения индикатора выполнения.
  • Внутренний цикл будет выполняться за 10 000 итераций с задержкой 0,001 сек.

Посмотрите, насколько круто выглядит анимация! Скопируйте код ниже, подшаманьте над ним немного на своё усмотрение и запустите.

from tqdm.notebook import trange for i in trange(10, desc="Traning Model on 10 Epochs"): sleep(0.01) for x in trange(10000, desc=f"Epoch "): sleep(0.001)

tqdm для Data Science

В этой части мы соединим функционал библиотек tqdm и pandas и с помощью progress_apply применим функцию к датафрейму, чтобы добавить прогресс-бар.

Загружаем датасет

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

Набор содержит 119390 строк с данными о бронирований номеров в городских гостиницах и курортных отелях в период с 1 июля 2015 года по 31 августа 2017 года, включая фактически прибывшие и отмененные бронирования.

import pandas as pd df = pd.read_csv("hotel_booking.csv") df.head().to_frame()

Применение функции с помощью tqdm

Создадим новый столбец user_name с именами клиентов.

  • функция tqdm.pandas нужна для инициализации прогресс-бара в датафрейме. Добавим к нему название Processing the name colum.
  • Функция user_name приводит строку к нижнему регистру и заменяет пробелы на " - ".
  • Применим функцию к датафрейму с помощью .progress_apply() . Она аналогична функции apply() . А для функции map() можно использовать .progress_map() .
  • Отображаем три верхние строки нашего набора данных
# задаём имя прогресс-бару tqdm.pandas(desc="Processing the name column") # преобразование текста def user_name(text): return text.lower().replace(" ","-") # применение функции к столбцу df["user_name"] = df["name"].progress_apply(user_name) # вывод первых трёх строк df.head(3)

Утилита для параллельной обработки

Библиотека tqdm нужна не только для написания прогресс-баров для циклов, в ней есть также утилиты для параллельной обработки, например, функция tqdm.contrib.concurrent .

Давайте попробуем извлечь доменные имена из адресов электронной почты в столбце email .

  • Импортируем process_map из tqdm.contrib.concurrent .
  • С помощью функции provider_extraction разделим текст сначала по знаку " @ ", затем по знаку " . ".
  • Применяем функцию process_map к столбцу email . В качестве параметров укажем max_worker , равный 8, основываясь на количестве ядер процессора, и зададим chunksize , равный 64.
  • Добавим имя прогресс-бара и настроим его цвет — пусть будет зелёный.
  • Выводим первые пять строк столбца email_provider .
from tqdm.contrib.concurrent import process_map # функция для извлечения email def provider_extraction(email): return email.split("@")[1].split(".")[0] # применения функции к столбцу df["email_provider"] = process_map( provider_extraction, df["email"], max_workers=8, chunksize=64, desc="Extracting Email provider", colour='green' ) df["email_provider"].head().to_frame()

Мы поэкспериментировали с библиотекой tqdm, но она, на самом деле, может гораздо больше. Почитайте документацию и узнаете о других её возможностях.

Обновляемый progressbar для программ на Python

Модуль tqdm предназначен для быстрого и расширяемого внедрения индикаторов выполнения (progressbar) во внешние интерфейсы программ на Python, предоставляя конечным пользователям визуальную индикацию хода вычислений или передачи данных. Он также будет полезен в целях отладки, как в качестве инструмента профилирования, так и в качестве способа отображения информации журнала итеративной задачи. Благодаря простоте использования библиотека также является идеальным кандидатом для включения в образовательные курсы Python.

Содержание:

  • Установка модуля tqdm в виртуальное окружение;
  • Использование модуля tqdm ;
  • Добавление описания и дополнительной статистики к progressbar;
  • Обертывание методов чтения/записи;
  • Известные проблемы модуля tqdm ;
  • Удобные функции модуля tqdm ;
  • Интеграция с модулем asyncio ;
  • Интеграция с модулем Pandas ;
  • Интеграция с IPython/Jupyter ;
  • Режим интерфейса командной строки модуля tqdm ;

Проблемы, которые решает модуль tqdm .

Распространенной проблемой при программировании является наличие итерационных операций, когда мониторинг процесса желателен или даже выгоден. Распространенной стратегией мониторинга итераций, является включение дополнительного кода в цикл for для вывода текущего номера итерации или каких то дополнительных промежуточных данных. Тем не менее, есть много улучшений, которые можно было бы сделать в таком сценарии:

  • отображение скорости итерации;
  • отображение прошедшего и предполагаемого времени завершения,
  • а также показывая все вышеперечисленное в одной постоянно обновляемой строке.

Решение всех этих проблем может потребовать больше времени и усилий разработчика, чем остальная часть содержимого цикла. Модуль tqdm решает все эти проблемы раз и навсегда, используя "Pythonic" шаблоны, для упрощения задач по добавления визуально привлекательных настраиваемых индикаторов выполнения без значительного снижения производительности даже в самых требовательных сценариях.

Для общих целей, модуль содержит режим интерфейса командной строки. CLI представляет собой полезный инструмент для системных администраторов, контролирующих поток данных по каналам.

Установка модуля tqdm в виртуальное окружение.

Модуль tqdm размещен на PyPI, поэтому установка относительно проста.

# создаем виртуальное окружение, если нет $ python3 -m venv .venv --prompt VirtualEnv # активируем виртуальное окружение $ source .venv/bin/activate # обновляем `pip` (VirtualEnv):~$ python3 -m pip install -U pip # ставим модуль `tqdm` (VirtualEnv):~$ python3 -m pip install -U tqdm

Использование модуля tqdm .

Модуль tqdm очень универсален и может использоваться разными способами. Основное и оригинальное использование tqdm это оборачивание итерируемых объектов Python. Просто оберните итерируемый объект классом tqdm.tqdm() :

>>> from tqdm import tqdm >>> from time import sleep # оборачиваем итератор range(100) классом tqdm() >>> for i in tqdm(range(100), ncols=80, ascii=True, desc='Total'): . sleep(0.1) # Total: 100%|#################################| 100/100 [00:10 

Если во время выполнения нужен дополнительный вывод, то вместо функции print() используйте метод tqdm.write() и он предотвратит перенос прогресс бара:

>>> from tqdm import tqdm >>> from time import sleep >>> text = "" >>> for char in tqdm(["a", "b", "c", "d"], ncols=80): . sleep(0.25) . text = text + char . tqdm.write(text) # a # ab # abc # abcd # 100%|██████████████████████████████| 4/4 [00:01 

Класс tqdm.trange(i) - это специальный оптимизированный экземпляр tqdm.tqdm(range(i)) . Аргументы, которые он принимает при инициализации, аналогичны конструктора класса tqdm.tqdm() :

>>> from tqdm import trange >>> from time import sleep >>> for i in trange(100, ncols=80, desc='Total'): . sleep(0.01) # Total: 100%|██████████████████████████████| 100/100 [00:01 

Создание экземпляра tqdm.tqdm() вне цикла позволяет вручную управлять строкой progressbar и добавлять динамические/обновляемые данные:

>>> from tqdm import tqdm >>> from time import sleep >>> pbar = tqdm(["a", "b", "c", "d"], ncols=80) >>> for char in pbar: . sleep(0.25) . # добавление префикса и элементов итерации к прогресс бару . pbar.set_description(f"Processing 'char>'") # Processing 'd': 100%|██████████████████████████████| 4/4 [00:01 

Модуль tqdm поддерживает вложенные индикаторы выполнения. Смотрим пример:

>>> from tqdm.auto import trange >>> from time import sleep >>> for i in trange(4, desc='loop-1'): . for j in trange(5, desc='loop-2'): . for k in trange(50, desc='loop-3', leave=False): . sleep(0.01) 

Ручное управление обновлениями строки прогресс бара класса tqdm() с помощью оператора with (могут быть проблемы с обновлением):

>>> from time import sleep >>> from tqdm import tqdm >>> with tqdm(total=30) as pbar: . for i in range(3): . sleep(0.1) . pbar.update(10) 

Добавление описания и дополнительной статистики к progressbar.

Пользовательская информация может отображаться и динамически обновляться на прогресс барах модуля tqdm с помощью аргументов desc и postfix :

from tqdm import tqdm, trange from random import random, randint from time import sleep with trange(10) as t: for i in t: # Описание будет отображаться слева t.set_description('GEN %i' % i) # postfix будет отображаться справа, # форматируется автоматически на основе типа данных аргумента t.set_postfix(loss=random(), gen=randint(1,999), str='h', lst=[1, 2]) sleep(0.1) with tqdm(total=10, bar_format=" 8.2g>", postfix=["Batch", dict(value=0)]) as t: for i in range(10): sleep(0.1) t.postfix[1]["value"] = i / 2 t.update() 
  • в postfix также необходимо передать в качестве начального аргумента в совместимом формате
  • и postfix будет автоматически преобразован в строку, если это объект типа dict . Чтобы предотвратить такое поведение, вставьте в словарь дополнительный элемент, где ключ не является строкой.

Дополнительные параметры bar_format также могут быть определены путем переопределения format_dict , а сама панель может быть изменена с помощью ascii :

from tqdm import tqdm class TqdmExtraFormat(tqdm): """Предоставляет параметр формата `total_time`""" @property def format_dict(self): d = super(TqdmExtraFormat, self).format_dict total_time = d["elapsed"] * (d["total"] or 0) / max(d["n"], 1) d.update(total_time=self.format_interval(total_time) + " in total") return d for i in TqdmExtraFormat(range(9), ascii=" .oO0", bar_format=" : %| "): if i == 4: break # 00:00 in total: 44%|0000. | 4/9 [00:00 

Обратите внимание, что также поддерживает спецификатор формата [width][type] .

  • width :
    • по умолчанию - не указано и автоматически заполняет ncols (всю строку экрана);
    • int >= 0: фиксированная ширина переопределяет аргумент ncols ;
    • int < 0: вычитает из автоматического значения по умолчанию (т.е. от длины строки экрана)
    • a : ascii (переопределяет аргумент как ascii=True )
    • u : unicode (переопределяет аргумент как ascii=False )
    • b : пусто (переопределяет аргумент как ascii=' ' )

    Это означает, что фиксированная полоса с текстом, выровненным по правому краю, может быть создана с помощью: bar_format='|right-justified' .

    Обертывание методов чтения/записи.

    Чтобы пропускать изменения в progressbar через методы файлового объекта file.read() или file.write() , можно использовать метод модуля tqdm.wrapattr() :

    Смотрим пример на основе скачивания файла по URL-адресу:

    import requests, os from tqdm import tqdm eg_link = "https://caspersci.uk.to/matryoshka.zip" response = requests.get(eg_link, stream=True) with tqdm.wrapattr(open(os.devnull, "wb"), "write", miniters=1, desc=eg_link.split('/')[-1], total=int(response.headers.get('content-length', 0))) as fout: for chunk in response.iter_content(chunk_size=4096): fout.write(chunk) 

    Известные проблемы модуля tqdm .

    Наиболее распространенные проблемы связаны с чрезмерным выводом в несколько строк вместо аккуратного однострочного индикатора выполнения.

    • Консоли в целом: требуется поддержка возврата каретки (CR, r).
    • Вложенные индикаторы выполнения:
      • Консоли в целом: требуется поддержка перемещения курсора вверх на предыдущую строку. Например, IDLE, ConEmu и PyCharm не имеют полной поддержки.
      • Windows: дополнительно может потребоваться модуль colorama , чтобы вложенные столбцы оставались в пределах соответствующих строк.
      • Среды, которые поддерживают Unicode, будут иметь сплошные гладкие индикаторы выполнения. Запасной вариант - это полоса, состоящая только из символов ascii.
      • Консоли Windows часто лишь частично поддерживают Unicode и поэтому часто требуют явной передачи аргумента ascii=True . Это связано либо с тем, что символы Юникода нормальной ширины неправильно отображаются, либо с тем, что некоторые символы Юникода вообще не отображаются.
      • Встроенные функции генераторы Python имеют тенденцию скрывать длину итерируемых объектов.
      • Замените tqdm(enumerate(. )) на enumerate(tqdm(. )) или tqdm(enumerate(x), total=len(x). ) . То же самое относится к numpy.ndenumerate .
      • Замените tqdm(zip(a, b)) на zip(tqdm(a), b) или даже zip(tqdm(a), tqdm(b)) .
      • То же самое относится и к встроенному модулю itertools .

      Удобные функции модуля tqdm .

      Для более удобной работы по построению прогресс баров, подмодуль tqdm.contrib содержит несколько оптимизированных функций, эквивалентных встроенным.

      tqdm.contrib.tenumerate(iterable, start=0, total=None, tqdm_class=tqdm.auto.tqdm, **tqdm_kwargs) :

      Функция tqdm.contrib.tenumerate() это эквивалент numpy.ndenumerate или встроенной функции enumerate() .

      • **tqdm_kwargs : ключевые аргументы для настройки класса tqdm.tqdm() .
      tqdm.contrib.tzip(iter1, *iter2plus, **tqdm_kwargs) :

      Функция tqdm.contrib.tzip() это эквивалент встроенной функции zip() .

      • **tqdm_kwargs : ключевые аргументы для настройки класса tqdm.tqdm() .
      tqdm.contrib.tmap(function, *sequences, **tqdm_kwargs) :

      Функция tqdm.contrib.tmap() это эквивалент встроенной функции map() .

      • **tqdm_kwargs : ключевые аргументы для настройки класса tqdm.tqdm() .
      tqdm.contrib.itertools.product(*iterables, **tqdm_kwargs) :

      Функция tqdm.contrib.itertools.product() это эквивалент функции itertools.product() .

      • **tqdm_kwargs : ключевые аргументы для настройки класса tqdm.tqdm() .
      tqdm.contrib.telegram.tqdm(*iterables, token=None, chat_id=None, **tqdm_kwargs) :

      Отправляет обновления боту Telegram. Аргумент **tqdm_kwargs это ключевые аргументы класса tqdm.tqdm() .

      from tqdm.contrib.telegram import tqdm, trange for i in tqdm(iterable, token=' ', chat_id=' '): . 
      tqdm.contrib.logging.logging_redirect_tqdm(loggers=None, tqdm_class=std_tqdm) :

      logging_redirect_tqdm() это вспомогательная функциональность для взаимодействия с ведением журнала stdlib . Диспетчер контекста перенаправляет ведение журнала в консоли на tqdm.write() , не затрагивая другие обработчики ведения журнала (например, файлы журнала).

      • Необязательный аргумент loggers : это список обработчиков, требующих перенаправления (по умолчанию: [logging.root] ).
      • Необязательный аргумент tqdm_class : класс модуля tqdm , который будет заниматься перенаправлением.
      import logging from tqdm import trange from tqdm.contrib.logging import logging_redirect_tqdm LOG = logging.getLogger(__name__) if __name__ == '__main__': logging.basicConfig(level=logging.INFO) with logging_redirect_tqdm(): for i in trange(9): if i == 4: LOG.info("Ведение журнала консоли перенаправлено на `tqdm.write()`") # logging restored 
      tqdm.contrib.concurrent :

      Подмодуль tqdm.contrib.concurrent это тонкая обертка вокруг встроенного модуля concurrent.futures .

      Подмодуль включает в себя насколько функций:

      • ensure_lock(tqdm_class, lock_name="") : функция получает или создает при необходимости, а затем восстанавливает блокировку tqdm_class .
      • thread_map(fn, *iterables, **tqdm_kwargs) : эквивалент list(map(fn, *iterables)) , управляемый ThreadPoolExecutor . Принимаемые аргументы:
        • необязательный аргумент max_workers : максимальное количество рабочих потоков; передается в ThreadPoolExecutor .
        • **tqdm_kwargs : это ключевые аргументы для настройки tqdm.tqdm()
        • необязательный аргумент max_workers : максимальное количество рабочих процессов; передается в ProcessPoolExecutor .
        • необязательный аргумент chunksize : размер блоков, отправляемых рабочим процессам; передается в ProcessPoolExecutor.map() . По умолчанию 1.
        • lock_name это член tqdm_class.get_lock() для использования, по умолчанию: mp_lock.
        • **tqdm_kwargs : это ключевые аргументы для настройки tqdm.tqdm()

        Интеграция с модулем asyncio .

        Обратите внимание, что оператор break в настоящее время не перехватывается асинхронными итераторами. Это означает, что в этом случае tqdm не может очистить себя после выхода из цикла. Для очистки ресурсов необходимо вручную закрыть pbar.close() , либо использовать синтаксис диспетчера контекста:

        from tqdm.asyncio import tqdm with tqdm(range(9)) as pbar: async for i in pbar: if i == 2: break 

        Подмодуль tqdm.asyncio включает в себя еще несколько функций:

        • tqdm_asyncio() : это асинхронная версия класса tqdm() (Python 3.6+).
        • as_completed(cls, fs,*, loop=None, timeout=None, total=None, **tqdm_kwargs) : это обертка для asyncio.as_completed .
        • gather(cls, *fs, loop=None, timeout=None, total=None, **tqdm_kwargs) : это обертка для asyncio.gather .
        • tarange(*args, **kwargs) : ссылка на tqdm.asyncio.tqdm(range(*args), **kwargs) .

        Интеграция с модулем Pandas .

        Пример для DataFrame.progress_apply и DataFrameGroupBy.progress_apply :

        import pandas as pd import numpy as np from tqdm import tqdm df = pd.DataFrame(np.random.randint(0, 100, (100000, 6))) # регистрация `pandas.progress_apply` и `pandas.Series.map_apply` с `tqdm` # (можно использовать необязательные `kwargs` класса `tqdm.notebook.tqdm`) tqdm.pandas(desc="my bar!") # Теперь можно использовать `progress_apply` вместо `apply` # и `progress_map` вместо `map` df.progress_apply(lambda x: x**2) # также можно группировать: # df.groupby(0).progress_apply(lambda x: x**2) 

        Примечание: код выше будет работать, если модуль tqdm >= v4.8: для версий tqdm ниже 4.8 вместо tqdm.pandas() нужно сделать следующим образом:

        from tqdm import tqdm, tqdm_pandas tqdm_pandas(tqdm()) 

        Если интересно, как модифицировать его для собственных обратных вызовов, импортируйте модуль и запустите help() .

        Интеграция с модулем IPython/Jupyter .

        IPython/Jupyter поддерживается при помощи подмодуля tqdm.notebook . Пример для запуска в ноутбуке:

        from tqdm.notebook import trange, tqdm from time import sleep for i in trange(3, desc='1st loop'): for j in tqdm(range(100), desc='2nd loop'): sleep(0.01) 

        Версия для ноутбука поддерживает проценты или пиксели для общей ширины (например: ncols='100%' или ncols='480px' ).

        Также tqdm может автоматически выбирать между консольной версией или версией для ноутбука с помощью подмодуля tqdm.autonotebook :

        from tqdm.autonotebook import tqdm tqdm.pandas() 

        Обратите внимание, что при запуске в ноутбуке это может вызвать предупреждение TqdmExperimentalWarning , так как невозможно различить блокнот jupyter и консоль jupyter . Чтобы отключить это предупреждение необходимо использовать подмодуль tqdm.auto вместо tqdm.autonotebook .

        Обратите внимание, что в блокнотах, полоса будет отображаться в ячейке, где он был создан. Это может быть не та ячейка, где она используется. Если это нежелательно, то:

        • отложить создание прогресс бара до ячейки, где он должен отображаться;
        • создать панель с display=False , а в более позднем вызове ячейки display(bar.container) .
        from tqdm.notebook import tqdm pbar = tqdm(. , display=False) # другая ячейка display(pbar.container) 

        Другая возможность состоит в том, чтобы иметь один прогресс бар (в верхней части ноутбука), который постоянно используется повторно (для этого можно использовать метод pbar.reset() , вместо pbar.close() ). По этой причине версия tqdm для ноутбука, при возникновении исключения, не вызывает автоматически pbar.close() .

        from tqdm.notebook import tqdm pbar = tqdm() # другая ячейка iterable = range(100) # инициализация с новым `total` pbar.reset(total=len(iterable)) for i in iterable: pbar.update() # принудительно выводит окончательный статус, но не закрывает pbar.refresh() 

        Режим интерфейса командной строки модуля tqdm .

        $ seq 9999999 | tqdm --total 9999999 --ncols 80 | wc -l 100%|██████████████████████████████| 9999999/9999999 [00:0100:00, 6088208.15it/s] 

        Резервное копирование большого каталога? Обратите внимание, что в качестве параметров командной строки можно использовать аргументы конструктора класса tqdm.tqdm() .

        $ tar -zcf - docs/ | tqdm --bytes --total `du -sb docs/ | cut -f1` \ > ~/backup.tgz 44%|██████████████▊ | 153M/352M [00:1400:18, 11.0MB/s] 

        А можно сделать и так:

        $ BYTES="$(du -sb docs/ | cut -f1)" $ tar -cf - docs/ \ | tqdm --bytes --total "$BYTES" --desc Processing | gzip \ | tqdm --bytes --total "$BYTES" --desc Compressed --position 1 \ > ~/backup.tgz Processing: 100%|██████████████████████| 352M/352M [00:1400:00, 30.2MB/s] Compressed: 42%|█████████▎ | 148M/352M [00:1400:19, 10.9MB/s] 

        Параметры командной строки модуля tqdm .

        • delim : символ-разделитель, по умолчанию: '\n' . NB: в системах Windows Python преобразует '\n' в '\r\n' .
        • buf_size : целое число, размер строкового буфера в байтах (по умолчанию: 256), используемый при указании разделителя.
        • bytes : bool , если true , то будут подсчитываться байты, игнорируются разделители, а также по умолчанию для unit_scale будет установлено значение true , для unit_divisor - 1024, а для unit - 'B' .
        • tee : bool , если true , то передает stdin как в stderr , так и в stdout .
        • update : bool , если true , то будет обрабатывать входные данные как недавно прошедшие итерации, т. е. числа для передачи в update() . Обратите внимание, что это происходит медленно (~2e5 it/s), т.к. каждый ввод должен быть декодирован как число.
        • update_to : bool , если true , будет обрабатывать входные данные как общее количество прошедших итераций, т. е. числа для присвоения self.n . Обратите внимание, что это происходит медленно (~2e5 it/s).
        • null : bool , если true , то ввод будет отброшен (без стандартного вывода).
        • manpath : str, каталог для справочных страниц tqdm .
        • comppath : строка, каталог в котором стоит завершить работу tqdm .
        • log : строка, CRITICAL|FATAL|ERROR|WARN(ING)|[default: 'INFO']|DEBUG|NOTSET.

        Примечание: Обратите внимание, что в качестве параметров командной строки можно использовать аргументы конструктора класса tqdm.tqdm() .

        • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
        • Создание умного progressbar для программы Python
        • Классы tqdm() и trange() модуля tqdm Python

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

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

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

        Используем Progress

        Первым у нас идёт модуль 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()

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

        Используем tqdm

        Следующей на очереди идёт библиотека 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)

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

        Используем alive-progress

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

        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)

        GUI индикатор прогресса для скрипта

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

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

        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

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

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

        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()

        Заключение

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

        • progress bar
        • индикатор прогресса

        Добавляем в Jupyter Notebooks красоту и интерактивность

        Я выношу части в отдельные файлы и подключаю их через import в блокноте. Лучшего не нашел.

        Комментарий пока не оценивали 0
        Ответить Добавить в закладки Ещё

        Я выношу части в отдельные файлы и подключаю их через import в блокноте. Лучшего не нашел.

        Комментарий пока не оценивали 0
        Ответить Добавить в закладки Ещё

        А с voila пробовали работать?

        Комментарий пока не оценивали 0
        Ответить Добавить в закладки Ещё
        Показать предыдущий комментарий
        Не пробовал, посмотрел по вашей наводке, понравились.
        Комментарий пока не оценивали 0
        Ответить Добавить в закладки Ещё

        Для индикации прогресса еще классная библиотечка tqdm (не реклама, не моя!). Заворачиваете то, по чему итерируете, в tqdm или tqdm_notebook, и оно создает прогресс бар для консоли и/или для jupyter.

        Показывает текстовый прогрессбар:

        for i in tqdm(range(10000)): run_something() 100%|██████████| 100/100 [00:00 

        Или для красивого графического прогрессбара:

        for i in tqdm_notebook(range(10000)): run_something() 

        Всего голосов 3: ↑3 и ↓0 +3
        Ответить Добавить в закладки Ещё
        Показать предыдущий комментарий

        tqdm это вообще одна из лучших библиотек в питоне по моему мнению — делает ровно то, что заявлено, пользоваться элементарно.

        Всего голосов 1: ↑1 и ↓0 +1
        Ответить Добавить в закладки Ещё

        Очень зашёл streamlit — написал полноценный прототипчик на нем, идеальный UX от использования!

        Комментарий пока не оценивали 0
        Ответить Добавить в закладки Ещё
        Показать предыдущий комментарий
        Да, его пробовал. Понравился
        Комментарий пока не оценивали 0
        Ответить Добавить в закладки Ещё

        А можете привести пример проекта, где вся эта красота и интерактивность действительно нужна? Прошу прощения, если нубский вопрос.

        Комментарий пока не оценивали 0
        Ответить Добавить в закладки Ещё
        Показать предыдущий комментарий

        Вот чтобы прямо «вся красота», не приведу.

        А частично — много где.
        ПрогрессБары при обработке массивов данных использую постоянно.
        Или календарики для выбора даты.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *