Wydajność w samouczku Python: Generator & Przykład zysku a zwrot

Spisie treści:

Anonim

Co to jest wydajność Pythona?

Słowo kluczowe yield w pythonie działa jak zwrot z only

Różnica polega na tym, że zamiast zwracać wartość, zwraca obiekt wywołujący obiekt generatora.

Gdy funkcja jest wywoływana, a wątek wykonywania znajduje słowo kluczowe yield w funkcji, wykonywanie funkcji zatrzymuje się na samym wierszu i zwraca obiekt generatora z powrotem do obiektu wywołującego.

W tym samouczku Python dowiesz się:

  • Co to jest wydajność Pythona?
  • Składnia
  • Co to są generatory w Pythonie?
  • Różnica między funkcją normalną a funkcją generatora.
  • Jak odczytać wartości z generatora?
  • Generatory są jednorazowego użytku
  • Przykład: generatory i wydajność dla serii Fibonacciego
  • Przykład: wywołanie funkcji z zyskiem
  • Kiedy używać Yield zamiast Return w Pythonie
  • Zysk a zwrot

Składnia

yield expression

Opis

Wydajność w Pythonie zwraca obiekt generatora. Generatory to specjalne funkcje, które należy powtarzać, aby uzyskać wartości.

Słowo kluczowe yield konwertuje podane wyrażenie na funkcję generatora, która zwraca obiekt generatora. Aby uzyskać wartości obiektu, należy wykonać iterację, aby odczytać wartości podane w wydajności.

Przykład: metoda uzyskiwania plonów

Oto prosty przykład wydajności. Funkcja testyield () zawiera słowo kluczowe yield z ciągiem znaków „Witamy w samouczkach Pythona Guru99”. Gdy funkcja jest wywoływana, wyjście jest drukowane i zamiast rzeczywistej wartości podaje obiekt generatora.

def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)

Wynik:

Podane dane wyjściowe to obiekt generatora, który ma wartość, którą podaliśmy, aby uzyskać.

Ale nie otrzymujemy przesłania, które musimy przekazać, aby uzyskać wydajność!

Aby wydrukować komunikat przekazany do yield będzie musiał wykonać iterację obiektu generatora, jak pokazano w poniższym przykładzie:

def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)

Wynik

Welcome to Guru99 Python Tutorials

Co to są generatory w Pythonie?

Generatory to funkcje zwracające iterowalny obiekt generatora. Wartości z obiektu generatora są pobierane pojedynczo zamiast pełnej listy razem, a zatem w celu uzyskania rzeczywistych wartości można użyć pętli for, używając metody next () lub list ().

Korzystanie z funkcji generatora

Możesz tworzyć generatory za pomocą funkcji generatora i wyrażenia generatora.

Funkcja generatora jest jak normalna funkcja, zamiast zwracać wartość, będzie miała słowo kluczowe yield.

Aby utworzyć funkcję generatora, musisz dodać słowo kluczowe yield. Poniższe przykłady pokazują, jak utworzyć funkcję generatora.

def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)

Wynik:

HELLO

Różnica między funkcją normalną a funkcją generatora.

Zrozummy, czym różni się funkcja generatora od normalnej funkcji.

Istnieją 2 funkcje normal_test () i generator_test ().

Obie funkcje mają zwracać ciąg znaków „Hello World”. Funkcja normal_test () używa funkcji return, a generator_test () - yield.

# Normal functiondef normal_test():return "Hello World"#Generator functiondef generator_test():yield "Hello World"print(normal_test()) #call to normal functionprint(generator_test()) # call to generator function

Wynik:

Hello World

Dane wyjściowe pokazują, że wywołanie normalnej funkcji normal_test () zwraca ciąg znaków Hello World. W przypadku funkcji generatora ze słowem kluczowym yield zwraca , a nie ciąg.

Jest to główna różnica między funkcją generatora a normalną funkcją. Teraz, aby pobrać wartość z obiektu generatora, musimy albo użyć obiektu wewnątrz pętli for, albo użyć metody next (), albo skorzystać z list ().

print(next(generator_test())) # will output Hello World

Kolejną różnicą, którą należy dodać do funkcji generatora normalnej funkcji v / s, jest to, że gdy wywołasz normalną funkcję, wykonanie rozpocznie się i zatrzyma, gdy zostanie zwrócone, a wartość zostanie zwrócona do obiektu wywołującego. Więc kiedy wykonanie się rozpocznie, nie możesz zatrzymać normalnej funkcji w międzyczasie i zatrzyma się tylko wtedy, gdy napotka słowo kluczowe return.

Ale w przypadku funkcji generatora, gdy wykonanie rozpocznie się, gdy otrzyma pierwszy zysk, zatrzymuje wykonywanie i zwraca obiekt generatora. Możesz użyć obiektu generatora, aby uzyskać wartości, a także wstrzymać i wznowić zgodnie z wymaganiami.

Jak odczytać wartości z generatora?

Wartości z obiektu generatora można odczytać za pomocą list (), pętli for i metody next ().

Używanie: list ()

Lista jest obiektem iterowalnym, którego elementy są umieszczone w nawiasach kwadratowych, a użycie funkcji list () na obiekcie generatora da wszystkie wartości, które posiada generator.

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))

Wynik:

[0, 2, 4, 6, 8]

Zastosowanie: for-in

W tym przykładzie istnieje funkcja zdefiniowana even_numbers (), która poda wszystkie liczby parzyste dla zdefiniowanego n. Wywołanie funkcji even_numbers () zwróci obiekt generatora, który jest używany wewnątrz pętli for.

Przykład:

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)

Wynik:

02468

Korzystanie z next ()

Metoda next () daje następny element na liście, w tablicy lub obiekcie. Gdy lista jest pusta i wywołanie metody next () zwróci błąd z sygnałem stopIteration. Ten błąd z next () wskazuje, że na liście nie ma więcej elementów.

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))

Wynik:

02468Traceback (most recent call last):File "main.py", line 11, in print(next(num))StopIteration

Generatory są jednorazowego użytku

O ile generatory są dostępne do jednorazowego użytku. Jeśli spróbujesz ich ponownie użyć, będą puste.

Na przykład:

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))

Wynik:

02468Calling the generator again: []

W przypadku, gdy chcesz, aby dane wyjściowe były ponownie używane, będziesz musiał ponownie wywołać funkcję.

Przykład: generatory i wydajność dla serii Fibonacciego

Poniższy przykład pokazuje, jak używać generatorów i zysków w Pythonie. Przykład wygeneruje szereg Fibonacciego.

def getFibonnaciSeries(num):c1, c2 = 0, 1count = 0while count < num:yield c1c3 = c1 + c2c1 = c2c2 = c3count += 1fin = getFibonnaciSeries(7)print(fin)for i in fin:print(i)

Wynik:

0112358

Przykład: wywołanie funkcji z zyskiem

W tym przykładzie zobaczymy, jak wywołać funkcję z wydajnością.

Poniższy przykład zawiera funkcję o nazwie test (), która zwraca kwadrat podanej liczby. Jest jeszcze jedna funkcja o nazwie getSquare (), która używa testu () ze słowem kluczowym yield. Wyjście podaje wartość kwadratową dla podanego zakresu liczb.

def test(n):return n*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)

Wynik:

0149162536496481

Kiedy używać Yield zamiast Return w Pythonie

Słowo kluczowe Python3 Yield zwraca generator do wywołującego, a wykonanie kodu rozpoczyna się dopiero po iteracji generatora.

Powrót w funkcji koniec wykonania funkcji i jedna wartość jest zwracana do wywołującego.

Oto sytuacja, w której powinieneś użyć Yield zamiast Return

  • Użyj zysku zamiast zwrotu, gdy rozmiar danych jest duży
  • Wydajność to najlepszy wybór, gdy chcesz, aby wykonanie było szybsze na dużych zbiorach danych
  • Użyj yield, jeśli chcesz zwrócić duży zestaw wartości do funkcji wywołującej
  • Wydajność to skuteczny sposób wytwarzania danych, które są duże lub nieskończone.

Zysk a zwrot

Oto różnice między zyskiem a zwrotem

Wydajność Powrót
Yield zwraca obiekt generatora do obiektu wywołującego, a wykonanie kodu rozpoczyna się dopiero po iteracji generatora. Zwrot w funkcji jest końcem wykonywania funkcji, a wywołującemu zwracana jest pojedyncza wartość.
Gdy funkcja jest wywoływana i napotyka słowo kluczowe yield, wykonywanie funkcji zostaje zatrzymane. Zwraca obiekt generatora z powrotem do wywołującego. Wykonywanie funkcji rozpocznie się dopiero po wykonaniu obiektu generatora. Gdy funkcja jest wywoływana, rozpoczyna się wykonywanie, a wartość jest zwracana wywołującemu, jeśli występuje słowo kluczowe return. Powrót wewnątrz funkcji oznacza koniec wykonywania funkcji.
wyrażenie wydajności wyrażenie powrotu
Żadna pamięć nie jest używana, gdy używane jest słowo kluczowe yield. Pamięć jest przydzielana dla zwracanej wartości.
Bardzo przydatne, jeśli masz do czynienia z ogromnym rozmiarem danych, ponieważ pamięć nie jest używana. Wygodny w przypadku bardzo małych rozmiarów danych.
Wydajność jest lepsza, jeśli słowo kluczowe yield jest używane do dużych rozmiarów danych. Dużo pamięci jest używane, jeśli rozmiar danych jest ogromny, co obniża wydajność.
Czas wykonania jest szybszy w przypadku wydajności dla dużych rozmiarów danych. Czas wykonania jest dłuższy, ponieważ wykonywane jest dodatkowe przetwarzanie w przypadku, gdy rozmiar danych jest duży, będzie działać dobrze dla małych rozmiarów danych.

Podsumowanie:

  • Słowo kluczowe yield w pythonie działa jak zwrot, z tą różnicą, że zamiast zwracać wartość, zwraca wywołującemu funkcję generatora.
  • Generator to specjalny typ iteratora, który po użyciu nie będzie ponownie dostępny. Wartości nie są przechowywane w pamięci i są dostępne tylko po wywołaniu.
  • Wartości z generatora można odczytać za pomocą metod for-in, list () i next ().
  • Główną różnicą między yieldem a zwrotem jest to, że yield zwraca funkcję generatora do obiektu wywołującego, a return daje wywołującemu pojedynczą wartość.
  • Wydajność nie przechowuje żadnych wartości w pamięci, a zaletą jest to, że jest pomocna przy dużych rozmiarach danych, ponieważ żadna z wartości nie jest przechowywana w pamięci.
  • Wydajność jest lepsza, jeśli słowo kluczowe yield jest używane w porównaniu do zwracania danych o dużym rozmiarze.