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, но она, на самом деле, может гораздо больше. Почитайте документацию и узнаете о других её возможностях.

Отслеживание времени работы на языке python

Индикаторы для определения степени выполнения работы скрипта или отдельной функции можно выделить в класс, который называется 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) 

Видим, что информации стало еще больше

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

Прогрессбар tqdm, отображение шагов при изменяемом шаге иттерации

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

from tqdm import tqdm from time import sleep fmt = '% ( of )' iteration = (3, 2, 1, 4) bar = tqdm(total=sum(iteration), bar_format=fmt) for i in iteration: sleep(i) bar.update(i) 

Будет отображать:

30% 3 of 10 50% 5 of 10 60% 6 of 10 100% 10 of 10 
30% 1 of 4 50% 2 of 4 60% 3 of 4 100% 4 of 4 

Отслеживать
задан 5 окт 2022 в 9:57
1,438 6 6 серебряных знаков 16 16 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

На основе фрагмента из справки, по внедрению собственного параметра в прогрессбар.

from tqdm import tqdm from time import sleep class TqdmTick(tqdm): def __init__(self, ticks, *args, **kwargs): self._ticks = ticks self._tick = 0 super().__init__(*args, **kwargs) def tick(self, value): self._tick += 1 self.update(value) @property def format_dict(self): d = super().format_dict d.update(tick=str(self._tick), ticks=str(self._ticks)) return d fmt = ' of %' iteration = (3, 2, 1, 4) bar = TqdmTick(ticks=len(iteration), total=sum(iteration), bar_format=fmt) for i in iteration: sleep(i) bar.tick(i) 

Отслеживать
ответ дан 5 окт 2022 в 12:46
1,438 6 6 серебряных знаков 16 16 бронзовых знаков

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.3.8.5973

Обновляемый 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

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

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