Postępowo

Jednym z najbardziej popularnych elementów większości języków programowania są pętle. Pętla to kawałek kodu, który się uruchamia w kółko wiele razy (abo niewiele razy, albo w szczególnych przypadkach raz albo wcale, nie ma to jak solidne objaśnienie...) dopóki spełniony jest jakiś warunek - a potem sterowanie przekazywane jest dalej.

Przykładem pętli w życiu codziennym może być:

-- Kop ten rów do trzeciej.

Na komputerowo to będzie na przykład:

dopóki (teraz() < 15:00) {
    kop_rów();
}

Pętle mogą być ograniczone nie tylko czasowo (jak w przykładzie powyżej), ale też ilościowo. Na przykład: wbij na patelnię sześć jajek.

dopóki (wbito mniej niż sześć jajek):
    wbij_jajko()

Składni pętli jest mnóstwo, każdy język ma to zrobione po swojemu, a nawet w ramach jednego języka na ogół mamy do wyboru kilka rodzajów pętli na różne okazje. Na przykład w VBA możemy mieć pętlę For... Next albo Do While ... Loop albo Do ... Loop While ... albo For Each ... Next ... i tak dalej. Podobnie w innych językach, jest z czego wybierać.

Pętle są oczywiście bardzo wygodnym narzędziem, ale ich efektem ubocznym jest - zwłaszcza w przypadku dłuższych pętli - wydłużenie czasu wykonania naszego kodu. Jeżeli pętla wykonuje się milion razy, a każde pojedyncze wykonanie trwa, dajmy na to, jedną milisekundę, to będzie się to wykonywać prawie siedemnaście minut. Jeżeli w ciągu tych siedemnastu minut niczego nie pokażemy użytkownikowi na ekranie, ten gotów będzie pomyśleć, że się ustrojstwo skitwasiło i ubije nasz wspaniały program zanim ów zdąży cokolwiek wyprodukować.

Rozwiązanie? Wskaźnik postępu! Otóż okazuje się, że człowiek, który musi poczekać na zakończenie działania jakiegoś komputerowego cosia odczuwa subiektywnie szybszy upływ czasu jeżeli może się pogapić na animowaną klepsydrę, pasek postępu czy inne cudo. Prawda jest oczywiście taka, że jeżeli nasz program oprócz wykonywania zadania właściwego (czyli pętli) ma jeszcze dodatkowo wyświetlać animację (pasek postępu, klepsydrę czy co tam jeszcze), to faktyczny czas wykonania się wydłuży. Niedużo, ale jednak. Mózg ludzki to dziwne zwierzę i ten odrobinę dłuższy czas wykonania zda nam się krótszy.

Po tym nieco przydługim i przygłupim wstępniaku czas na samo gęste, czyli jak (w Pythonie) pokazać użytkownikowi pasek postępu przy dłuższych pętlach tak, żeby było ładnie, sensownie, a zarazem w miarę szybko.

Zaczynamy od zainstalowania biblioteki alive-progress:

pip install alive-progress

Od tej pory możemy w naszych skryptach używać takiego oto cudaka:

from alive_progress import alive_bar
from time import sleep

kroki = 1000

with alive_bar(kroki) as bar:
    for n in range(kroki):
        sleep(0.01)
        bar()

Efekt:

Jak widać mamy nie tylko ładny, animowany pasek postępu, ale dodatkowo kupę informacji: ile już cosiów wykonaliśmy, ile wykonujemy cosiów na sekundę, kiedy spodziewamy się skończyć.

Dodatkowo możemy opatrzyć nasz pasek postępu etykietką:

with alive_bar(kroki) as bar:
    for n in range(kroki):
        sleep(0.01)
        bar.text(f'Iteracja numer {n}')
        bar()

Opcji jest dużo, dużo więcej - zainteresowanych odsyłam do dokumentacji.

5 komentarzy

  1. Fajniutkie, dzięki. Akurat klepię skrypcik, któremu pewna operacja zajmuje sporo czasu i zaczynałem myśleć, czy nie warto pokazać jakoś postępu, więc przymierzę.

  2. Fajna sprawa. Dzięki. Wcześniej korzystałem z podobnego rozwiązania, w tej chwili nie pamiętam już nazwy, ale ten polecany przez Ciebie ma więcej ficzerów.

    1. Obstawiam, że przedtem korzystałeś z tqdm – to chyba najpopularniejsza biblioteka oferująca paski postępu i dużo starsza od alive-progress

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]