Rendimiento en Python Tutorial: Generator & Ejemplo de rendimiento versus retorno
ยฟQuรฉ es Python ยฟproducir?
La palabra clave de rendimiento en Python funciona como un retorno con el รบnico
La diferencia es que en lugar de devolver un valor, devuelve un objeto generador al llamador.
Cuando se llama a una funciรณn y el hilo de ejecuciรณn encuentra una palabra clave yield en la funciรณn, la ejecuciรณn de la funciรณn se detiene en esa lรญnea y devuelve un objeto generador al llamador.
Sintaxis
yield expression
Mareas Ideales para Lecciones
Python yield devuelve un objeto generador. GeneratorLas s son funciones especiales que deben iterarse para obtener los valores.
La palabra clave yield convierte la expresiรณn dada en una funciรณn generadora que devuelve un objeto generador. Para obtener los valores del objeto, se debe iterar para leer los valores dados a yield.
Ejemplo: mรฉtodo de rendimiento
Aquรญ hay un ejemplo simple de yield. La funciรณn testyield() tiene una palabra clave yield con la cadena โBienvenido a Guru99 Python Tutorialesโ. Cuando se llama a la funciรณn, se imprime la salida y proporciona un objeto generador en lugar del valor real.
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() print(output)
Salida:
<generator object testyield at 0x00000028265EB9A8>
La salida dada es un objeto generador, que tiene el valor que le hemos dado a yield.
ยกPero no estamos entendiendo el mensaje que tenemos que dar para producir resultados!
Para imprimir el mensaje entregado a yield tendremos que iterar el objeto generador como se muestra en el siguiente ejemplo:
def testyield():
yield "Welcome to Guru99 Python Tutorials"
output = testyield()
for i in output:
print(i)
Salida:
Welcome to Guru99 Python Tutorials
ยฟQuรฉ son Generators en Python?
GeneratorLas funciones s son funciones que devuelven un objeto generador iterable. Los valores del objeto generador se obtienen de a uno por vez en lugar de la lista completa en conjunto y, por lo tanto, para obtener los valores reales, puede utilizar un bucle for, utilizando el mรฉtodo next() o list().
El uso de Generator funciรณn
Puede crear generadores utilizando la funciรณn de generador y la expresiรณn de generador.
Una funciรณn generadora es como una funciรณn normal, en lugar de tener un valor de retorno, tendrรก una palabra clave yield.
Para crear una funciรณn generadora, deberรก agregar una palabra clave yield. Los siguientes ejemplos muestran cรณmo crear una funciรณn generadora.
def generator():
yield "H"
yield "E"
yield "L"
yield "L"
yield "O"
test = generator()
for i in test:
print(i)
Salida:
H E L L O
Diferencia entre funciรณn normal v/s Generator funciรณn.
Entendamos en quรฉ se diferencia una funciรณn generadora de una funciรณn normal.
Hay 2 funciones normal_test() y generator_test().
Se supone que ambas funciones deben devolver la cadena โHola mundoโ. La funciรณn normal_test() utiliza return y la funciรณn generator_test() utiliza 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
Salida:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
El resultado muestra que cuando se llama a la funciรณn normal normal_test(), devuelve la cadena Hola mundo. Para una funciรณn generadora con la palabra clave yield, devuelve y no la cuerda.
Esta es la principal diferencia entre una funciรณn generadora y una funciรณn normal. Ahora, para obtener el valor del objeto generador, debemos utilizar el objeto dentro del bucle for o utilizar el mรฉtodo next() o hacer uso de list().
print(next(generator_test())) # will output Hello World
Una diferencia mรกs para agregar entre la funciรณn normal y la funciรณn generadora es que cuando llamas a una funciรณn normal, la ejecuciรณn comenzarรก y se detendrรก cuando llegue a volvemos y el valor se devuelve a la persona que llama. Entonces, cuando comienza la ejecuciรณn, no puede detener la funciรณn normal en el medio y solo se detendrรก cuando encuentre la palabra clave return.
Pero en el caso de la funciรณn generadora, una vez que comienza la ejecuciรณn, cuando obtiene el primer rendimiento, detiene la ejecuciรณn y devuelve el objeto generador. Puede usar el objeto generador para obtener los valores y tambiรฉn pausar y reanudar segรบn sus necesidades.
ยฟCรณmo leer los valores del generador?
Puede leer los valores de un objeto generador utilizando una lista(), un bucle for y el mรฉtodo next().
Usando: lista()
Una lista es un objeto iterable que tiene sus elementos dentro de corchetes. El uso de list() en un objeto generador proporcionarรก todos los valores que contiene el generador.
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
print(list(num))
Salida:
[0, 2, 4, 6, 8]
Usando: para-en
En el ejemplo, hay una funciรณn definida even_numbers() que te proporcionarรก todos los nรบmeros pares para el n definido. La llamada a la funciรณn even_numbers() devolverรก un objeto generador, que se utiliza dentro del bucle for.
Ejemplo:
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)
Salida:
0 2 4 6 8
Usando siguiente()
El mรฉtodo next() le proporcionarรก el siguiente elemento de la lista, matriz u objeto. Una vez que la lista estรฉ vacรญa, y si se llama a next(), devolverรก un error con la seรฑal stopIteration. Este error, de next() indica que no hay mรกs elementos en la lista.
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))
Salida:
0
2
4
6
8
Traceback (most recent call last):
File "main.py", line 11, in <module>
print(next(num))
StopIteration
Generators son de uso รบnico
En el caso de los generadores, estos solo estรกn disponibles para su uso una vez. Si intentas usarlos nuevamente, estarรกn vacรญos.
Por ejemplo:
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))
Salida:
0 2 4 6 8 Calling the generator again: []
En caso de querer que se vuelva a utilizar la salida, tendrรกs que realizar la llamada para volver a funcionar.
Ejemplo: Generatorsy rendimiento para series de Fibonacci
El siguiente ejemplo muestra cรณmo utilizar generadores y rendimiento en Python. El ejemplo generarรก la serie de 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)
Salida:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
Ejemplo: llamada a funciรณn con rendimiento
En este ejemplo veremos cรณmo llamar a una funciรณn con rendimiento.
El siguiente ejemplo tiene una funciรณn llamada prueba() que devuelve el cuadrado del nรบmero dado. Hay otra funciรณn llamada getSquare() que usa test() con la palabra clave de rendimiento. El resultado proporciona el valor cuadrado para un rango de nรบmeros determinado.
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)
Salida:
0 1 4 9 16 25 36 49 64 81
Cuรกndo utilizar rendimiento en lugar de retorno en Python
Python3 rendimiento La palabra clave devuelve un generador al llamador y la ejecuciรณn del cรณdigo comienza solo cuando se itera el generador.
A volvemos en una funciรณn es el final de la ejecuciรณn de la funciรณn y se devuelve un รบnico valor a la persona que llama.
Aquรญ estรก la situaciรณn en la que deberรญas usar Yield en lugar de Return
- Utilice rendimiento en lugar de retorno cuando el tamaรฑo de los datos sea grande
- El rendimiento es la mejor opciรณn cuando necesita que su ejecuciรณn sea mรกs rรกpida en grandes conjuntos de datos
- Utilice rendimiento cuando desee devolver un gran conjunto de valores a la funciรณn de llamada
- El rendimiento es una forma eficiente de producir datos grandes o infinitos.
Rendimiento versus retorno
Aquรญ estรกn las diferencias entre rendimiento y retorno.
| Rendimiento | Devoluciones |
|---|---|
| Yield devuelve un objeto generador al llamador, y la ejecuciรณn del cรณdigo comienza solo cuando se itera el generador. | Un retorno en una funciรณn es el final de la ejecuciรณn de la funciรณn y se devuelve un รบnico valor a la persona que llama. |
| Cuando se llama a la funciรณn y encuentra la palabra clave yield, la ejecuciรณn de la funciรณn se detiene. Devuelve el objeto generador al invocador. La ejecuciรณn de la funciรณn comenzarรก solo cuando se ejecute el objeto generador. | Cuando se llama a la funciรณn, la ejecuciรณn comienza y el valor se devuelve a la persona que llama si hay una palabra clave de retorno. El retorno dentro de la funciรณn marca el final de la ejecuciรณn de la funciรณn. |
| expresiรณn de rendimiento | expresiรณn de retorno |
| No se utiliza memoria cuando se utiliza la palabra clave de rendimiento. | La memoria se asigna para el valor devuelto. |
| Muy รบtil si tiene que lidiar con datos de gran tamaรฑo ya que no se utiliza la memoria. | Conveniente para tamaรฑos de datos muy pequeรฑos. |
| El rendimiento es mejor si se utiliza la palabra clave de rendimiento para datos de gran tamaรฑo. | Se utiliza mucha memoria si el tamaรฑo de los datos es enorme, lo que obstaculizarรก el rendimiento. |
| El tiempo de ejecuciรณn es mรกs rรกpido en caso de rendimiento para datos de gran tamaรฑo. | El tiempo de ejecuciรณn utilizado es mayor ya que se realiza un procesamiento adicional en caso de que el tamaรฑo de sus datos sea enorme, funcionarรก bien para tamaรฑos de datos pequeรฑos. |
Resumen
- La palabra clave yield en Python funciona como un retorno con la รบnica diferencia de que en lugar de devolver un valor, devuelve una funciรณn generadora al llamador.
- Un generador es un tipo especial de iterador que, una vez utilizado, no estarรก disponible nuevamente. Los valores no se almacenan en la memoria y solo estรกn disponibles cuando se los llama.
- Los valores del generador se pueden leer utilizando los mรฉtodos for-in, list() y next().
- La principal diferencia entre yield y return es que yield devuelve una funciรณn generadora al llamador y return le da un valor รบnico al llamador.
- Yield no almacena ninguno de los valores en la memoria y la ventaja es que resulta รบtil cuando el tamaรฑo de los datos es grande, ya que ninguno de los valores se almacena en la memoria.
- El rendimiento es mejor si se utiliza la palabra clave de rendimiento en comparaciรณn con el retorno de datos de gran tamaรฑo.
