Resa in Python Tutorial: Generator & Rendita vs esempio di rendimento

Cos'è il rendimento di Python?

La parola chiave yield in python funziona come un ritorno con the only

la differenza è che invece di restituire un valore, restituisce un oggetto generatore al chiamante.

Quando una funzione viene chiamata e il thread di esecuzione trova una parola chiave yield nella funzione, l'esecuzione della funzione si ferma a quella riga stessa e restituisce un oggetto generatore al chiamante.

In questo tutorial di Python imparerai:

  • Cos'è il rendimento di Python?
  • Sintassi
  • Cosa sono i generatori in Python?
  • Differenza tra funzione normale v / s funzione generatore.
  • Come leggere i valori dal generatore?
  • I generatori sono monouso
  • Esempio: generatori e rendimento per la serie di Fibonacci
  • Esempio: chiamata di una funzione con rendimento
  • Quando usare Yield invece di Return in Python
  • Rendimento contro rendimento

Sintassi

yield expression

Descrizione

Python yield restituisce un oggetto generatore. I generatori sono funzioni speciali che devono essere iterate per ottenere i valori.

La parola chiave yield converte l'espressione data in una funzione generatore che restituisce un oggetto generatore. Per ottenere i valori dell'oggetto, deve essere iterato per leggere i valori dati alla resa.

Esempio: metodo di rendimento

Ecco un semplice esempio di resa. La funzione testyield () ha una parola chiave yield con la stringa "Welcome to Guru99 Python Tutorials". Quando la funzione viene chiamata, l'output viene stampato e fornisce un oggetto generatore invece del valore effettivo.

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

Produzione:

L'output fornito è un oggetto generatore, che ha il valore che abbiamo dato per produrre.

Ma non stiamo ricevendo il messaggio che dobbiamo dare per produrre in output!

Per stampare il messaggio dato a yield bisognerà iterare l'oggetto generatore come mostrato nell'esempio sotto:

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

Produzione

Welcome to Guru99 Python Tutorials

Cosa sono i generatori in Python?

I generatori sono funzioni che restituiscono un oggetto generatore iterabile. I valori dall'oggetto generatore vengono recuperati uno alla volta invece dell'elenco completo insieme e quindi per ottenere i valori effettivi è possibile utilizzare un ciclo for, utilizzando il metodo next () o list ().

Utilizzo della funzione generatore

È possibile creare generatori utilizzando la funzione del generatore e utilizzando l'espressione del generatore.

Una funzione generatore è come una normale funzione, invece di avere un valore di ritorno avrà una parola chiave yield.

Per creare una funzione generatore dovrai aggiungere una parola chiave yield. I seguenti esempi mostrano come creare una funzione generatore.

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

Produzione:

HELLO

Differenza tra funzione normale v / s funzione generatore.

Cerchiamo di capire in che modo una funzione del generatore è diversa da una funzione normale.

Ci sono 2 funzioni normal_test () e generator_test ().

Si suppone che entrambe le funzioni restituiscano la stringa "Hello World". Normal_test () usa return e generator_test () usa 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

Produzione:

Hello World

L'output mostra che quando chiami la funzione normale normal_test () restituisce la stringa Hello World. Per una funzione di generatore con la parola chiave yield, restituisce e non la stringa.

Questa è la principale differenza tra una funzione del generatore e una funzione normale. Ora per ottenere il valore dall'oggetto generatore dobbiamo utilizzare l'oggetto all'interno del ciclo for o utilizzare il metodo next () o utilizzare list ().

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

Un'altra differenza da aggiungere alla funzione normale del generatore di v / s è che quando si chiama una funzione normale, l'esecuzione inizierà e si interromperà quando tornerà e il valore verrà restituito al chiamante. Quindi, quando l'esecuzione inizia non è possibile interrompere la normale funzione nel mezzo e si fermerà solo quando si incontra la parola chiave return.

Ma in caso di funzione generatore una volta che l'esecuzione inizia quando ottiene il primo rendimento interrompe l'esecuzione e restituisce l'oggetto generatore. È possibile utilizzare l'oggetto generatore per ottenere i valori e anche mettere in pausa e riprendere secondo le proprie esigenze.

Come leggere i valori dal generatore?

Puoi leggere i valori da un oggetto generatore utilizzando un metodo list (), for-loop e next ().

Utilizzando: list ()

Una lista è un oggetto iterabile che ha i suoi elementi tra parentesi. L'uso di list () su un oggetto generatore darà tutti i valori che il generatore contiene.

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

Produzione:

[0, 2, 4, 6, 8]

Utilizzando: for-in

Nell'esempio, c'è una funzione definita even_numbers () che ti darà tutti i numeri pari per l'n definito. La chiamata alla funzione even_numbers () restituirà un oggetto generatore, che viene utilizzato all'interno del ciclo for.

Esempio:

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

Produzione:

02468

Utilizzando next ()

Il metodo next () ti darà l'elemento successivo nell'elenco, nell'array o nell'oggetto. Una volta che l'elenco è vuoto e se viene chiamato next (), restituirà un errore con il segnale stopIteration. Questo errore, da next () indica che non ci sono più elementi nell'elenco.

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))

Produzione:

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

I generatori sono monouso

In caso di generatori sono disponibili per l'uso una sola volta. Se provi a usarli di nuovo, sarà vuoto.

Per esempio:

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))

Produzione:

02468Calling the generator again: []

Nel caso in cui si desidera utilizzare nuovamente l'output, sarà necessario eseguire nuovamente la chiamata per funzionare.

Esempio: generatori e rendimento per la serie di Fibonacci

L'esempio seguente mostra come utilizzare i generatori e il rendimento in Python. L'esempio genererà la serie di Fibonacci.

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)

Produzione:

0112358

Esempio: chiamata di una funzione con rendimento

In questo esempio vedremo come chiamare una funzione con yield.

L'esempio seguente ha una funzione chiamata test () che restituisce il quadrato del numero specificato. C'è un'altra funzione chiamata getSquare () che usa test () con la parola chiave yield. L'output fornisce il valore quadrato per un determinato intervallo di numeri.

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)

Produzione:

0149162536496481

Quando usare Yield invece di Return in Python

La parola chiave Python3 Yield restituisce un generatore al chiamante e l'esecuzione del codice inizia solo quando il generatore viene iterato.

Un ritorno in una funzione è la fine dell'esecuzione della funzione e un singolo valore viene restituito al chiamante.

Ecco la situazione in cui dovresti usare Yield invece di Return

  • Usa yield invece di return quando la dimensione dei dati è grande
  • Il rendimento è la scelta migliore quando è necessario che l'esecuzione sia più veloce su set di dati di grandi dimensioni
  • Usa yield quando vuoi restituire un grande insieme di valori alla funzione chiamante
  • Il rendimento è un modo efficiente per produrre dati di grandi dimensioni o infiniti.

Rendimento contro rendimento

Ecco le differenze tra rendimento e rendimento

dare la precedenza Ritorno
Yield restituisce un oggetto generatore al chiamante e l'esecuzione del codice inizia solo quando il generatore viene iterato. Un ritorno in una funzione è la fine dell'esecuzione della funzione e un singolo valore viene restituito al chiamante.
Quando la funzione viene chiamata e incontra la parola chiave yield, l'esecuzione della funzione si interrompe. Restituisce l'oggetto generatore al chiamante. L'esecuzione della funzione inizierà solo quando viene eseguito l'oggetto generatore. Quando la funzione viene chiamata, l'esecuzione inizia e il valore viene restituito al chiamante se è presente la parola chiave return. Il ritorno all'interno della funzione segna la fine dell'esecuzione della funzione.
resa espressione espressione di ritorno
Nessuna memoria viene utilizzata quando viene utilizzata la parola chiave yield. La memoria viene allocata per il valore restituito.
Molto utile se devi gestire enormi dimensioni di dati in quanto la memoria non viene utilizzata. Comodo per dimensioni dei dati molto ridotte.
Le prestazioni sono migliori se la parola chiave yield viene utilizzata per dati di grandi dimensioni. Viene utilizzata molta memoria se la dimensione dei dati è enorme, il che ostacola le prestazioni.
Il tempo di esecuzione è più veloce in caso di resa per dati di grandi dimensioni. Il tempo di esecuzione utilizzato è maggiore in quanto viene eseguita un'elaborazione aggiuntiva nel caso in cui se la dimensione dei dati è enorme, funzionerà bene per piccole dimensioni dei dati.

Sommario:

  • La parola chiave yield in python funziona come un ritorno con l'unica differenza è che invece di restituire un valore, restituisce una funzione di generatore al chiamante.
  • Un generatore è un tipo speciale di iteratore che, una volta utilizzato, non sarà più disponibile. I valori non vengono salvati in memoria e sono disponibili solo quando vengono chiamati.
  • I valori dal generatore possono essere letti usando il metodo for-in, list () e next ().
  • La differenza principale tra yield e return è che yield restituisce una funzione generatrice al chiamante e return dà un singolo valore al chiamante.
  • Il rendimento non memorizza nessuno dei valori in memoria e il vantaggio è che è utile quando la dimensione dei dati è grande, poiché nessuno dei valori è archiviato in memoria.
  • Il rendimento è migliore se la parola chiave yield viene utilizzata in confronto per restituire dati di grandi dimensioni.

Articoli interessanti...