Pytanie. Przy generatorze nie mamy uzupełniania listy więc ten fakt powoduje nam, że pamięć faktycznie w porównaniu do pierwszej pętli z append'em nie jest tak używana. Po dodaniu listy "x" i append() do kodu z generatorem pamięć zachowuje się tak samo. Czy tu chodzi o to, że przy generatorach tworzenie listy nie ma uzasadnienia? Mógłbyś to jakoś skomentować, dzięki.
Odpowiem troszkę inaczej ale mam nadzieję, że wyjaśni to kiedy używać generatorów, a kiedy list. Generator powoli zwraca kolejną wartość, a tablica zwraca je wszystko na raz. Z generatora łatwo jest zrobić listę, a z listy generatora już w ten sam sposób nie zrobimy. Generator oszczędza nam zajmowanej pamięci ale też pozwala przetwarzać dane od razu po tym jak otrzymamy z niego jedną wartość, a w przypadku listy, musimy czekać aż powstanie cała lista (chyba, że inny mechanizm dodaje do niej dane jedna po drugiej). ######## Jeśli potrzebujesz przechowywać dane w liście i odwoływać się do nich wiele razy, to potrzebujesz listy. To jest przypadek kiedy masz np listę zakupów i później będziesz modyfikował ich liczbę, liczył cenę i tak dalej. Ale jeśli nie potrzebujesz jednocześnie wszystkich danych w pamięci, to generator jest super. To się sprawdza gdy mamy sporo danych i musimy z każdą z informacji coś zrobić ale nie musimy mieć ich wszystkich cały czas dostępnych i do nich później wracać. Gdybyśmy do nich wracali, musielibyśmy uzyskiwać je ponownie. W tym przypadku można po prostu zrobić z generatora listę. Generatory są właśnie o tyle wygodne, że można z nich łatwo zrobić listę i używać ich tak jak nam wygodnie, a z listy już niestety nie zrobisz generatora który oszczędzi pamięci. Z tego powodu tam gdzie ma to sens , lubię mieć generatory :) ######## A teraz może jakiś realistyczny przykład. Załóżmy, że masz dużo plików do przetworzenia. Złożony przykład to jakieś pliki w silniku gry. Przetwarzanie ich często długo trwa. Prosty przykład to po prostu zapchany dysk komputera ;) Będziemy się tego trzymali dla uproszczenia. Masz skrypt który zamienia pliki tekstowe na pdfy. Musisz znaleźć wszystkie pliki tekstowe na dysku i wygenerować te pdfy. Jeśli używasz funkcji która zwraca listę, to będzie długo się przetwarzała i może zwrócić naprawdę olbrzymią listę która zajmuje masę pamięci. Może skończyć się tak, że będziesz czekał długo aż program wylistuje te pliki, a na końcu scrashuje. Użyjmy zamiast tego generatora który zwraca ścieżkę do jednego pliku. Możesz w takim przypadku od razu utworzyć pdf, a potem generator zwróci ci kolejną ścieżkę txt z której zrobisz kolejnego pdfa. I tak w kółko :) Przy generatorze też łatwiej jest pauzować i wznawiać ponownie cały proces. Nie musisz w środku implementować pauzowania tylko po prostu pauzujesz pętlę która iteruje po tym generatorze. for file_path in generator_returning_txt_paths(root_path="C:/"): convert_to_csv(file_path)
Pierwszy film, ktory pokazuje praktyczne podejscie do generatorow, dziekuje Ci bardzo.
Zajebiste poradniki robisz!
Pytanie.
Przy generatorze nie mamy uzupełniania listy więc ten fakt powoduje nam, że pamięć faktycznie w porównaniu do pierwszej pętli z append'em nie jest tak używana. Po dodaniu listy "x" i append() do kodu z generatorem pamięć zachowuje się tak samo. Czy tu chodzi o to, że przy generatorach tworzenie listy nie ma uzasadnienia? Mógłbyś to jakoś skomentować, dzięki.
Odpowiem troszkę inaczej ale mam nadzieję, że wyjaśni to kiedy używać generatorów, a kiedy list.
Generator powoli zwraca kolejną wartość, a tablica zwraca je wszystko na raz. Z generatora łatwo jest zrobić listę, a z listy generatora już w ten sam sposób nie zrobimy.
Generator oszczędza nam zajmowanej pamięci ale też pozwala przetwarzać dane od razu po tym jak otrzymamy z niego jedną wartość, a w przypadku listy, musimy czekać aż powstanie cała lista (chyba, że inny mechanizm dodaje do niej dane jedna po drugiej).
########
Jeśli potrzebujesz przechowywać dane w liście i odwoływać się do nich wiele razy, to potrzebujesz listy. To jest przypadek kiedy masz np listę zakupów i później będziesz modyfikował ich liczbę, liczył cenę i tak dalej.
Ale jeśli nie potrzebujesz jednocześnie wszystkich danych w pamięci, to generator jest super. To się sprawdza gdy mamy sporo danych i musimy z każdą z informacji coś zrobić ale nie musimy mieć ich wszystkich cały czas dostępnych i do nich później wracać. Gdybyśmy do nich wracali, musielibyśmy uzyskiwać je ponownie. W tym przypadku można po prostu zrobić z generatora listę.
Generatory są właśnie o tyle wygodne, że można z nich łatwo zrobić listę i używać ich tak jak nam wygodnie, a z listy już niestety nie zrobisz generatora który oszczędzi pamięci. Z tego powodu tam gdzie ma to sens , lubię mieć generatory :)
########
A teraz może jakiś realistyczny przykład.
Załóżmy, że masz dużo plików do przetworzenia. Złożony przykład to jakieś pliki w silniku gry. Przetwarzanie ich często długo trwa.
Prosty przykład to po prostu zapchany dysk komputera ;) Będziemy się tego trzymali dla uproszczenia.
Masz skrypt który zamienia pliki tekstowe na pdfy. Musisz znaleźć wszystkie pliki tekstowe na dysku i wygenerować te pdfy.
Jeśli używasz funkcji która zwraca listę, to będzie długo się przetwarzała i może zwrócić naprawdę olbrzymią listę która zajmuje masę pamięci.
Może skończyć się tak, że będziesz czekał długo aż program wylistuje te pliki, a na końcu scrashuje.
Użyjmy zamiast tego generatora który zwraca ścieżkę do jednego pliku.
Możesz w takim przypadku od razu utworzyć pdf, a potem generator zwróci ci kolejną ścieżkę txt z której zrobisz kolejnego pdfa. I tak w kółko :)
Przy generatorze też łatwiej jest pauzować i wznawiać ponownie cały proces. Nie musisz w środku implementować pauzowania tylko po prostu pauzujesz pętlę która iteruje po tym generatorze.
for file_path in generator_returning_txt_paths(root_path="C:/"):
convert_to_csv(file_path)
@@KreatywnyKoder Dzięki bardzo za treściwe wyjaśnienie. Pozdrawiam.