SZUKAMY β-testerów Ścieżki Kariery Programisty AI! Zapisz się TU.

Generatory w Pythonie
Z życia wzięte
To historia o tym, jak generatory mogą uratować projekt.
Jakiś czas temu znajoma programistka AI szykowała roboczy model dot. raka piersi. Dataset składał się z ogromnych plików DIACOM, a każde „entry” to były dwa zdjęcia. Żeby model to łyknął, trzeba było to połączyć w jedno zdjęcie w typie i rozmiarze akceptowalnym przez model (tu akurat ViT). Niestety pomimo solidnego komputera z masywnym dyskiem i porządną pamięcią RAM, nie była w stanie przetworzyć danych. Musiała porzucić dataset na rzecz innego, lżejszego. Gdyby użyła generatora, po kilku (kilkudziesięciu?) godzinach pracy preprocessing byłby gotowy, a zużycie procesora minimalne.
Morał tej historii? Zakasaj rękawy i spróbuj naprawdę zrozumieć, jak działa generator. Być może w przyszłości uratuje Twój projekt.
Spis Treści
Co to jest generator w Pythonie?
Generatory to specjalny typ funkcji w Pythonie, tworzące obiekty iterowalne (również zwane generatorami) z pamięcią stanu, który generują dane na żądanie, a nie przechowują ich. Generatory wykorzystują instrukcję yield, która zawiesza działanie funkcji i zwraca wartość, a następnie może być wznowiona od miejsca zawieszenia przy następnym wywołaniu.
def licznik(start=1, krok=1):
i = start
while True:
yield i
i += krok
#wywołanie
g = licznik(start=100, krok=10)
print(next(g)) # 100
print(next(g)) # 110
print(next(g)) # 120
Po ostatnim yield generator rzuca błąd StopIteration, co jest sygnałem, że skończył generować dane (dlatego najlepiej jest wywoływać generator w pętli, która automatycznie się zakończy).
#wywołanie generatora w pętli
for x in licznik():
print(x)
#wywołanie generatora ręcznia
g = licznik()
try:
while True:
print(next(g))
except StopIteration:
print("Generator zakończył działanie.")
Generator vs lista
Porównajmy poniższe funkcje:
def lista_kwadratow(n):
return [x**2 for x in range(n)]
def generator_kwadratow(n):
for x in range(n):
yield x**2
Pierwsza funkcja od razu tworzy listę i ładuje do RAM-u wszystko. Druga tworzy tylko jedno x**2 naraz, zwraca tę informację i nie przechowuje jej w pamięci, co czyni ją idealną do pracy z dużymi danymi.
Generator lepiej radzi sobie w sytuacji, kiedy dane są ogromne (np. miliony rekordów), gdy nie potrzebujesz wszystkiego od razu (np. przetwarzasz ogromny tekst linijka po linijce), albo gdy chcesz zachować niskie zużycie RAM-u.
| Sytuacja | Generator ma sens? |
| Małe dane, które przeglądasz w kółko | ❌ Użyj listy |
| Plik 10 GB do przeczytania raz | ✅ Generator! |
| Łączenie się z API, ściągasz strony | ✅ Generator! |
| Symulacja zdarzeń w czasie rzeczywistym | ✅ Generator! |
| Chcesz „cofnąć” albo przeglądać wiele razy | ❌ Zrób listę z generatora |
Wyrażenie generatora (ang. generator expression)
Jak można się spodziewać po autorach Pythona, generator ma też swoją własną, prywatną komprehensję (choć nazwaną wyrażeniem), która wygląda prawie IDENTYCZNIE jak komprehensja listy czy zestawu – jedyną różnicą jest użycie nawiasów okrągłych.
Przepis podstawowy jest identyczny jak w komprehensji listy:
(operacja + for + element + in + struktura_iterowalna + if + warunek)
!Rada!
To już czwarte, prawie identyczne, wyrażenie, które jednak generuje zupełnie inną strukturę. Czytaj kod uważnie i używaj ostrożnie, żeby nie zrobić głupiego błędu.
Generatory w praktyce
1. Czytanie dużego pliku:
Gdy masz do przetworzenia wielki plik tekstowy (np. logi serwera, dane z pomiarów), nie musisz ładować całego pliku do pamięci. Generator pozwala czytać i przetwarzać linia po linii — bez ryzyka przeciążenia RAM-u.
def czytaj_linie(plik):
with open(plik, "r") as f:
for linia in f:
yield linia.strip()
Nie musisz ładować całego pliku do pamięci!
2. Paginacja danych z API:
Niektóre API (np. REST) udostępniają dane w stronach (paginacja). Generator pozwala pobierać te strony pojedynczo — tylko wtedy, gdy są potrzebne. To pozwala zbudować elastyczny pipeline danych bez czekania na całość.
def pobierz_strony(api):
strona = 1
while True:
dane = api.get(page=strona)
if not dane:
break
yield dane
strona += 1
3. Generowanie batchy danych do trenowania modelu:
W deep learningu dane często muszą być podawane do modelu partiami (batchami). Generator może dzielić dane na mniejsze porcje i podawać je sekwencyjnie — co znacznie oszczędza pamięć i daje większą kontrolę nad treningiem.
def batch_generator(dane, batch_size):
for i in range(0, len(dane), batch_size):
yield dane[i:i+batch_size]
Generatory w preprocessingu danych
Czasem nie chodzi tylko o czytanie danych, ale też o ich przygotowanie. W data science i AI często masz dane, które wymagają czasochłonnego preprocessingu: łączenia plików, konwersji, zmiany rozdzielczości czy formatów. Trzymanie wszystkich przetworzonych danych w pamięci to często zły pomysł.
Przykład: masz dane medyczne w formacie DICOM, które trzeba przekształcić do JPG, zmniejszyć, skleić, itd. Generator może na bieżąco:
- odczytywać pliki DICOM,
- przetwarzać je do odpowiedniego formatu,
- normalizować,
- i zwracać gotowy tensor lub obraz tylko wtedy, gdy model go potrzebuje.
To sposób, żeby nie zapchać pamięci, a mimo to mieć dane gotowe do pracy.
Ważne: generator to jednorazowa akcja
Generator po zużyciu jest wyczerpany (Pamiętasz? Rzuca błędem na koniec!). Jeśli chcesz go użyć po raz drugi, musisz stworzyć nowy obiekt.
g = licznik()
for i in g:
print(i)
for i in g:
print(i) # NIC się nie wydarzy, generator się skończył
Podsumowanie
Generatory to jedno z tych narzędzi w Pythonie, które początkowo wyglądają niepozornie i mało przydatne, ale potrafią diametralnie zmniejszyć zużycie pamięci i ułatwić pracę z dużymi zbiorami danych.
Jeśli myślisz o pracy z AI, analizą danych, przetwarzaniem tekstu czy budowaniem strumieni danych — prędzej czy później sięgniesz po generatory.
Zdecydowanie warto znać to narzędzie i wiedzieć, jak ich użyć.
Co dalej?
→ Zapisz się do naszego newslettera, żeby nigdy nie przegapić żadnego wartościowego artykułu.
→ Zajrzyj do sekcji Kariera w AI, gdzie znajdziesz konkretne materiały o zmianach na rynku pracy – w Polsce i na świecie – oraz ścieżkach kariery związanych ze sztuczną inteligencją (nie tylko jako programista!).
→ A jeśli chcesz pisać modele i pracować jako Architekt AI, ale nie wiesz, od czego zacząć (lub utknąłeś gdzieś na ścieżce), odwiedź dział Nauka AI – czeka tam wiedza, ciekawostki i realne wsparcie.
! Uwaga
Niniejszy ebook ma charakter informacyjny i edukacyjny. Nie stanowi porady prawnej ani oferty pracy w rozumieniu przepisów krajowych lub unijnych.
Przy tworzeniu niniejszego artykułu korzystano ze wsparcia narzędzi opartych na sztucznej inteligencji – m.in. w zakresie porządkowania treści, analizy źródeł, przyspieszenia redakcji i wyszukiwania źródeł Jednak wszelkie decyzje dotycząca treści, interpretacji i ostatecznej formy zostały podjęte przez człowieka.



