Ceda în Python tutorial: Generator Exemplu de randament vs randament

Ce Este Python Randament?

Cuvântul cheie yield din python funcționează ca un randament cu singurul

diferența este că, în loc să returneze o valoare, returnează un obiect generator apelantului.

Când o funcție este apelată și firul de execuție găsește un cuvânt cheie yield în funcție, execuția funcției se oprește la acea linie însăși și returnează un obiect generator înapoi apelantului.

Sintaxă

yield expression

Description

Python yield returnează un obiect generator. Generators sunt funcții speciale care trebuie repetate pentru a obține valorile.

Cuvântul cheie yield convertește expresia dată într-o funcție generatoare care returnează un obiect generator. Pentru a obține valorile obiectului, acesta trebuie repetat pentru a citi valorile date randamentului.

Exemplu: Metoda randamentului

Iată un exemplu simplu de randament. Funcția testyield() are un cuvânt cheie yield cu șirul „Welcome to Guru99 Python Tutoriale„. Când funcția este apelată, rezultatul este imprimat și oferă un obiect generator în loc de valoarea reală.

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

ieșire:

<generator object testyield at 0x00000028265EB9A8>

Ieșirea dată este un obiect generator, care are valoarea pe care am dat-o pentru a produce.

Dar nu primim mesajul pe care trebuie să-l transmitem pentru a obține rezultate!

Pentru a imprima mesajul dat pentru randament, va trebui să repetați obiectul generator așa cum se arată în exemplul de mai jos:

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

output = testyield()
for i in output:
    print(i)

ieșire:

Welcome to Guru99 Python Tutorials

Care sunt Generators în Python?

Generators sunt funcții care returnează un obiect generator iterabil. Valorile din obiectul generator sunt preluate una câte una în loc de lista completă împreună și, prin urmare, pentru a obține valorile reale, puteți utiliza o buclă for, folosind metoda next() sau list().

Utilizarea Generator funcţie

Puteți crea generatoare folosind funcția generator și folosind expresia generator.

O funcție generatoare este ca o funcție normală, în loc să aibă o valoare returnată, va avea un cuvânt cheie yield.

Pentru a crea o funcție generatoare, va trebui să adăugați un cuvânt cheie yield. Următoarele exemple arată cum să creați o funcție de generator.

def generator():
    yield "H"
    yield "E"
    yield "L"
    yield "L"
    yield "O"

test = generator()
for i in test:
    print(i)

ieșire:

H
E
L
L
O

Diferența dintre funcția normală v/s Generator Funcția.

Să înțelegem cum o funcție de generator este diferită de o funcție normală.

Există 2 funcții normal_test() și generator_test().

Se presupune că ambele funcții returnează șirul „Hello World”. Normal_test() folosește return și generator_test() folosește yield.

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

ieșire:

Hello World
<generator object generator_test at 0x00000012F2F5BA20>

Rezultatul arată că atunci când apelați funcția normală normal_test() returnează șirul Hello World. Pentru o funcție generatoare cu cuvânt cheie yield, returnează si nu sfoara.

Aceasta este principala diferență dintre o funcție de generator și o funcție normală. Acum, pentru a obține valoarea de la obiectul generator, trebuie fie să folosim obiectul din interiorul buclei, fie să folosim metoda next() sau să folosim list().

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

O altă diferență de adăugat la funcția normală v/s funcția generator este că atunci când apelați o funcție normală, execuția va începe și se va opri când ajunge la reveni iar valoarea este returnată apelantului. Deci, atunci când începe execuția, nu puteți opri funcția normală între ele și se va opri doar când va întâlni cuvântul cheie return.

Dar în cazul funcției de generator, odată ce execuția începe când obține primul randament, oprește execuția și redă obiectul generator. Puteți utiliza obiectul generator pentru a obține valorile și, de asemenea, întrerupeți și reluați înapoi conform cerințelor dvs.

Cum se citesc valorile de la generator?

Puteți citi valorile dintr-un obiect generator folosind o listă (), buclă for și folosind metoda next().

Folosind : list()

O listă este un obiect iterabil care are elementele între paranteze. Folosind list() pe un obiect generator va da toate valorile pe care le deține generatorul.

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

ieșire:

[0, 2, 4, 6, 8]

Folosind: for-in

În exemplu, există o funcție definită even_numbers() care vă va oferi toate numerele pare pentru n definit. Apelul la funcția even_numbers() va returna un obiect generator, care este folosit în bucla for.

Exemplu:

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

ieșire:

0
2
4
6
8

Folosind next()

Metoda next() vă va oferi următorul articol din listă, matrice sau obiect. Odată ce lista este goală și dacă este apelată next() , va returna o eroare cu semnalul stopIteration. Această eroare, de la next() indică faptul că nu mai există elemente în listă.

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

ieșire:

0
2
4
6
8
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    print(next(num))
StopIteration

Generators sunt de o singură dată

În cazul generatoarelor, acestea sunt disponibile pentru utilizare o singură dată. Dacă încercați să le utilizați din nou, acesta va fi gol.

De exemplu:

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

print("\n")
print("Calling the generator again: ", list(num))

ieșire:

0
2
4
6
8
Calling the generator again:  []

În cazul în care doriți ca ieșirea să fie utilizată din nou, va trebui să efectuați apelul pentru a funcționa din nou.

Exemplu: Generators și randament pentru seria Fibonacci

Următorul exemplu arată cum să folosiți generatoarele și să cedați Python. Exemplul va genera seria Fibonacci.

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

ieșire:

<generator object getFibonnaciSeries at 0x0000007F39C8BA20>
0
1
1
2
3
5
8

Exemplu: Funcție de apelare cu randament

În acest exemplu, vom vedea cum să apelați o funcție cu randament.

Exemplul de mai jos are o funcție numită test() care returnează pătratul numărului dat. Există o altă funcție numită getSquare() care folosește test() cu cuvântul cheie yield. Ieșirea oferă valoarea pătrată pentru un interval de numere dat.

def test(n):
    return n*n

def getSquare(n):
    for i in range(n):
        yield test(i)

sq = getSquare(10)
for i in sq:
    print(i)

ieșire:

0
1
4
9
16
25
36
49
64
81

Când să utilizați Yield în loc de Return în Python

Python3 Randament cuvântul cheie returnează un generator apelantului și execuția codului începe numai atunci când generatorul este iterat.

A reveni într-o funcție este sfârșitul execuției funcției și o singură valoare este returnată apelantului.

Iată situația în care ar trebui să utilizați Yield în loc de Return

  • Utilizați randament în loc de returnare când dimensiunea datelor este mare
  • Randamentul este cea mai bună alegere atunci când aveți nevoie ca execuția dvs. să fie mai rapidă pe seturi mari de date
  • Utilizați yield atunci când doriți să returnați un set mare de valori funcției de apelare
  • Randamentul este o modalitate eficientă de a produce date mari sau infinite.

Randament vs. rentabilitate

Iată diferențele dintre Yield și Return

Randament Retur
Yield returnează apelantului un obiect generator, iar execuția codului începe numai când generatorul este iterat. O întoarcere într-o funcție este sfârșitul execuției funcției și o singură valoare este returnată apelantului.
Când funcția este apelată și întâlnește cuvântul cheie yield, execuția funcției se oprește. Acesta returnează obiectul generator înapoi apelantului. Execuția funcției va începe numai când obiectul generator este executat. Când funcția este apelată, execuția începe și valoarea este returnată apelantului dacă există cuvântul cheie return. Revenirea în interiorul funcției marchează sfârșitul execuției funcției.
exprimarea randamentului expresie returnată
Nu este utilizată nicio memorie când este utilizat cuvântul cheie yield. Memoria este alocată pentru valoarea returnată.
Foarte util dacă trebuie să faceți față cu dimensiuni uriașe de date, deoarece memoria nu este folosită. Convenabil pentru dimensiuni foarte mici de date.
Performanța este mai bună dacă cuvântul cheie yield este utilizat pentru dimensiuni mari de date. Este folosită multă memorie dacă dimensiunea datelor este mare, ceea ce va împiedica performanța.
Timpul de execuție este mai rapid în cazul randamentului pentru date mari. Timpul de execuție utilizat este mai mare, deoarece se efectuează o procesare suplimentară în cazul în care, dacă dimensiunea datelor dvs. este mare, va funcționa bine pentru dimensiunea mică a datelor.

Rezumat

  • Cuvântul cheie yield din python funcționează ca un return, singura diferență este că, în loc să returneze o valoare, redă o funcție generatoare apelantului.
  • Un generator este un tip special de iterator care, odată folosit, nu va mai fi disponibil. Valorile nu sunt stocate în memorie și sunt disponibile numai atunci când sunt apelate.
  • Valorile din generator pot fi citite folosind metoda for-in, list() și next().
  • Principala diferență dintre yield și return este că yield returnează o funcție generatoare apelantului și return oferă o singură valoare apelantului.
  • Yield nu stochează niciuna dintre valori în memorie, iar avantajul este că este util atunci când dimensiunea datelor este mare, deoarece niciuna dintre valori nu este stocată în memorie.
  • Performanța este mai bună dacă cuvântul cheie yield este utilizat în comparație cu randamentul pentru dimensiuni mari de date.