Jak zwizualizować pasek postępu w Pythonie? Biblioteka tqdm

Cześć,
Ostatnio miałem trochę mniej regularne publikacje, postaram się to naprawić. 😉
Dzisiaj podzielę się z Tobą przydatną biblioteką Pythonową służącą wizualizacji postępu działania np. Twojego skryptu. Przed Tobą biblioteka tqdm. Zapraszam do lektury!

Scenariusz użycia biblioteki tqdm

Jakiś czas temu realizowałem zadanie, które polegało na odpytywaniu API, żeby pobrać informacje odnośnie określonych produktów. Wywołań API było bardzo dużo, a cała „akcja” co do zasady jednorazowa. Stworzony skrypt był odpalany z poziomu wiersza poleceń. Potrzeba było około 30 000 (!) wywołań. Odpytywanie odbywało się w sposób asynchroniczny, ale trwało dość długo.

Jak zatem zwizualizować fakt, że coś dzieje się w tle? Tak, żeby mieć pewność, że skrypt cały czas działa. (Oczywiście print() nie jest dobrym rozwiązaniem) 😉 Z pomocą przychodzi nam wspomniana biblioteka – tqdm.

Biblioteka tqdm Python

Jak wspominają sami autorzy, biblioteka tqdm jest narzędziem do tworzenia pasków postępu w Pythonie. Nazwa pochodzi od arabskiego słowa „taqadum”, oznaczającego „postęp” oraz jest skrótem od hiszpańskiego „te quiero demasiado” (kocham cię tak bardzo) 😀 Fun fact. Ale do sprawdzenia w tym źródle.

Warto wiedzieć, czym są obiekty iterowalne w Pythonie. To np. listy, krotki, słowniki czy ciągi znaków (stringi). Obiekty iterowalne można wykorzystać w pętlach, co pozwoli Ci łatwo przetwarzać ich zawartość.

Mowiąc, w skrócie, możemy „opakować” obiekty, które są „iterable” w Pythonie (można po nich iterować) i uzyskać wizualizację dotyczącą postępu wykonania danej czynności z nimi związanej. Np. iterujemy po liście, Pandasowym dataframe’ie czy odpytujemy API dla listy określonych produktów.

Przykłady użycia biblioteki tqdm

Samą bibliotekę oczywiście instalujemy komendą:

pip install tqdm

Najprostszy przykład kodu, który pokaże „o co chodzi” wygląda tak:

from tqdm import tqdm
import time

for i in tqdm(range(1000)):
    time.sleep(0.01)

Powyższy kod wykonuje pętlę 999 razy (pamiętaj, że w przypadku range() w Pythonie, parameter stop (w naszym przypadku 1000), de facto wykona się -1 razy). W każdej iteracji czeka 0,01 sekundy, a postęp wykonania pętli jest wizualizowany za pomocą paska postępu tqdm.

Odpalający skrypt w terminalu pokaże Ci się następujący pasek postępu:

Możesz też dodawać do paska postępu opis czy definiować wygląd. Tak jak w poniższym przykładzie:


for i in tqdm(range(100), desc="Zaawansowany pasek", ascii="░█"):
    time.sleep(0.05)

W dokumentacji znajdziesz opis działania poszczególnych argumentów/ parametrów.

Co ciekawe, biblioteki można też używać w zagnieżdżonych pętlach, tak jak w poniższym przykładzie:

from tqdm import trange
import time

for i in trange(3, desc='pętla zewnętrzna'):
    for j in trange(2, desc='pętla środkowa'):
        for k in trange(6, desc='pętla wewnętrzna'):
            time.sleep(1)

* trange() to de facto tdqm(range()). Opis znajdziesz we wskazanej wyżej dokumentacji

Scenariusze pracy z biblioteką tqdm

Tak jak wspominałem, najprostszy sposób użycia tqdm to opakowanie dowolnego iterowalnego obiektu (takiego, po którym możesz iterować.) funkcją tqdm().

  • Możesz użyć jej z biblioteką Pandas do śledzenia postępu operacji na Pandasowym DataFrame’ie,
  • Jeśli przetwarzasz duże pliki, np. czytając ich zawartość linia po linii, tqdm również może się przydać do monitorowania postępu,
  • Możliwe, że odpytujesz API (tak jak opisywałem swój przykład użycia), wówczas również fajnie sprawdza się biblioteka,
  • Po prostu działasz w jakiejś „długiej” pętli (lub innym obiekcie, po którym można iterować), a chcesz mieć pewność, że Twój skrypt odpalany z poziomu cmd/ Notebooka działa, skorzystaj z paska postępu tqdm.

Tak, tak jak napisałem wyżej, tqdm działa też z IPython/Jupyter Notebook’ami.

Możesz przetestować we wspomnianych notebookach działanie poniższego kodu:

from tqdm.notebook import tqdm
import time

colors = ["czerwony", "niebieski", "zielony", "żółty", "fioletowy"]
for color in tqdm(colors):
    time.sleep(1)
    print(color)

Podsumowanie

Czasem zdarza się, że skrypty Pythonowe odpalane są tylko z poziomu wiersza poleceń, a operacje, które dzieją się w tle są długotrwałe. Wówczas warto skorzystać z biblioteki tqdm, żeby zwizualizować sobie paskiem postępu, w jakim stadium jest nasz skrypt. Z biblioteki tqdm możesz korzystać w przypadku „iterowalnych” obiektów, czyli takich, po których możesz działać w pętli. Co ciekawe, tqdm wspiera też pracę z asynchronicznym wywoływaniem API (z czego sam skorzystałem realizując moje zadanie biznesowe).

Daj znać, czy takie artykuły sa dla Ciebie ciekawe. 

Inne artykuły Pythonowe na blogu

W jednym z wcześniejszych artykułów na moim blogu pisałem o integracji wizualizacji Pythonowych z Power BI’em. 

Artykuł został wspominany w Newsletterach: Dane i Analizy Łukasza Prokulskiego oraz Zobaczdane.pl, którego autorem jest Krzysztof Stencel. Było to bardzo miłe i motywujące do dalszego działania! 

Zachęcam do nadrobienia artykułu tutaj

Co do newslettera, zachęcam Cię do dołączenia do mojego, spod znaku „Dane są wszędzie” gdzie co jakiś czas dzielę się ciekawostkami ze świata danych, Power BI i nie tylko. W najbliższym czasie planuję częściej wysyłać ciekawostki tą drogą, dlatego zapraszam Cię do dołączenia już teraz.

Formularz zapisu znajdziesz poniżej, a także na mojej stronie głównej.

Tagi:
Dane są wszędzie, wiesz?

Zapisz się, jeśli interesujesz się Power BI'em i danymi. Co jakiś czas odezwę się z ciekawymi materiałami.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *