Рубрики
Без рубрики

Убийственные бары прогресса в Python

Этот пост принимает тур Whistlestop TQDM: фантастический, простой в использовании, расширяемой пакет бара прогресса для … Tagged с Python, инструмент.

Этот пост принимает тур Whistlestop TQDM : Фантастический, простой в использовании, расширяемой пакет бара прогресса для Python. Это делает добавление простых панелей прогресса в процессы Python чрезвычайно простым. Если вы являетесь инженером -программистом какого -либо опыта, скорее всего, вы будете использовать или разработать алгоритмы или преобразования данных, которые могут занять справедливое время – возможно, много часов или даже дней – для завершения.

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

Покажи мне код!

Вот где TQDM может войти. У него хороший чистый API, который позволяет быстро добавить панели прогресса в ваш код. Кроме того, он имеет легкий алгоритм оценки «сдержания времени», встроенный и в планку прогресса. Для целей этого поста взгляните на супер-минимальный пример измеченной петли для соскоба для сети с использованием TQDM , ниже:

import time
from tqdm import tqdm

def get():
    time.sleep(0.25)

with tqdm(total=100) as progress:
    for i in range(100):
        get()
        progress.update(1)

В этом простом примере вы настроили TQDM Прогресс, который ожидает процесса 100 шагов (скажем, 100 URL). Затем вы можете запустить петлю (с паузой 0,25 секунды между шагами), каждый раз, обновляя панель прогресса при завершении шага. Вы также можете обновить планку прогресса по произвольным суммам, если мы также вырваемся из петли. Это две строки кода (плюс оператор Import), чтобы получить хорошую небольшую панель прогресса в вашем коде:

Поддержка панд

Помимо прохладных небольших дополнений к выходам вашей программы, TQDM Также хорошо интегрируется с другими широко используемыми пакетами. Возьми Панды Например, вездесущая библиотека анализа данных Python. Данные ученые любят Панды , но некоторые преобразования в рамках данных могут занять справедливое время. К счастью, есть поддержка автоматического добавления TQDM Прогресс -бар на звонки в применить Метод в Панды Анкет Взгляните на пример ниже:

df = pd.read_csv("weather.csv")
tqdm.pandas(desc="Applying Transformation")
df.progress_apply(lambda x: x)

Когда вы запустите этот сценарий, вы увидите что -то вроде этого:

Технически, tqdm.pandas Метод обезьяны исправляет progress_apply Метод на Панды Структуры данных, предоставляя им модифицированную версию общепринятого метода применения. Практически, когда мы называем progress_apply Метод, пакет завершает стандартный Панды применить Метод с TQDM индикатор. Это может очень удобно, когда вы обрабатываете большие кадры данных!

Поддержка параллельной обработки

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

import time
from tqdm.contrib.concurrent import process_map

def my_process(_):
   time.sleep(0.25)

r = process_map(my_process, range(0, 100), max_workers=2, desc="MyProcess")

В этом случае у вас будет одна строка прогресса, которая каждый раз обновляется A my_process звонить. Есть вариант второго использования: как насчет того, если у вас есть несколько длительных процессов, и вы хотите отслеживать их индивидуально? Это может быть предпочтительным, если вы хотите избежать сериализации и, например, де-протериализации больших объектов в процессах и вне процессов. Вы тоже можете это сделать:

import time
import multiprocessing as mp
from tqdm import tqdm

def my_process(pos):
    _process = mp.current_process()
    with tqdm(desc=f"Process {pos}", total=100, position=pos) as progress:
        for _ in range(100):
            time.sleep(0.1)
            progress.update(1)

n_cpu = mp.cpu_count(
with mp.Pool(processes=n_cpu, initializer=tqdm.set_lock, initargs=(tqdm.get_lock(),)) as pool:
    pool.map(my_process, range(n_cpu))

Это должно дать вам вывод чем -то вроде:

Есть суть этого примера вы можете использовать тоже Анкет

Поддержка Юпитера

Последняя интеграция, которую я буду затрагиваю в этом посте, является встроенной поддержкой для использования TQDM В ноутбуке Юпитера. Для этого вам нужно убедиться, что вы установили Юпитер , а также ipywidgets . Тогда вам нужно запустить:

jupyter nbextension enable --py widgetsnbextension

Чтобы включить расширения. С помощью этой настройки, в ячейке в новой записной книжке, вы сможете запустить пример из более раннего:

from tqdm.notebook import tqdm

arr = list(range(100))

with tqdm(desc="My Progress bar", total=len(arr)) as progress:
    for element in arr:
        progress.update(1)

И увидеть что -то похожее на это:

Круто, верно?

дальнейшее чтение

Заинтересован в том, чтобы узнать больше о TQDM ? Вот Их GitHub Анкет

Изображение обложки для этого поста было взято из TED TALK ON GROST BARS Анкет Стоит проверить.

Оригинал: “https://dev.to/markdouthwaite/killer-progress-bars-in-python-3na6”