Tutorial de rendimiento en Python: Generator & Ejemplo de rendimiento versus retorno

¿Cuál es el rendimiento de Python?

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 generator objetar a la persona que llama.

Cuando se llama a una función y el hilo de ejecución encuentra una palabra clave de rendimiento en la función, la ejecución de la función se detiene en esa línea y devuelve un generator objeto de vuelta a la persona que llama.

Sintaxis

yield expression

Descripción

El rendimiento de Python devuelve un generator objeto. GeneratorLas s son funciones especiales que deben iterarse para obtener los valores.

La palabra clave de rendimiento convierte la expresión dada en una generator función que devuelve un generator objeto. Para obtener los valores del objeto, se debe iterar para leer los valores dados al rendimiento.

Ejemplo: método de rendimiento

A continuación se muestra un ejemplo sencillo de rendimiento. La función testyield() tiene una palabra clave de rendimiento con la cadena "Bienvenido a Guru99 Tutoriales de Python“. Cuando se llama a la función, la salida se imprime y da un generator objeto 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 una generator objeto, que tiene el valor que le hemos dado a ceder.

¡Pero no estamos entendiendo el mensaje que tenemos que dar para producir resultados!

Para imprimir el mensaje dado al rendimiento habrá que iterar el generator objeto 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 Generator¿Está en Python?

Generators son funciones que devuelven un iterable generator objeto. Los valores de la generator Los objetos se obtienen uno a la vez en lugar de la lista completa y, por lo tanto, para obtener los valores reales puede usar un bucle for, usando el método next() o list().

Usar Generator función

Puedes crear generators usando generator función y uso generator expresión.

A generator La función es como una función normal, en lugar de tener un valor de retorno, tendrá una palabra clave de rendimiento.

Para crear un generator función, deberá agregar una palabra clave de rendimiento. el siguientewing Los ejemplos muestran cómo crear un generator función.

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 cómo un generator La función es diferente de una función normal.

Hay 2 funciones normal_test() y generator_prueba().

Se supone que ambas funciones devuelven la cadena "Hola mundo". El normal_test() está usando retorno y generator_test() está usando rendimiento.

# 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 llamas a la función normal normal_test() devuelve una cadena Hola Mundo. Para generator función con la palabra clave de rendimiento devuelve <generator objeto generator_test en 0x00000012F2F5BA20> y no la cadena.

Esta es la principal diferencia entre un generator función y una función normal. Ahora para obtener el valor de la generator objeto necesitamos usar el objeto dentro del bucle for o usar el método next() o hacer uso de list().

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

Una diferencia más para agregar a la función normal v/s generator La función 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 caso de generator funciona una vez que comienza la ejecución, cuando obtiene el primer rendimiento, detiene la ejecución y devuelve el generator objeto. Puedes usar el generator objeto para obtener los valores y también, pausar y reanudar según sus necesidades.

Cómo leer los valores de la generator?

Puede leer los valores de un generator objeto usando una lista(), un bucle for y usando el método next().

Usando: lista()

Una lista es un objeto iterable que tiene sus elementos dentro. brackets.Usando list() en un generator objeto dará todos los valores que generator sostiene.

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 incluso_numbers() que te dará todo igual numbers para el n definido. La llamada a la función even_numbers() devolverá un generator objeto, 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 caso de generators están disponibles para su uso sólo una vez. Si intentas usarlos nuevamente, estará vacío.

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 following ejemplo muestra cómo usar generators 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 usar Yield en lugar de Return en Python

Rendimiento de Python3 palabra clave devuelve un generator a la persona que llama y la ejecución del código comienza sólo cuando el generator se repite.

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 Ida y vuelta
El rendimiento devuelve un generator objeto a la persona que llama, y ​​la ejecución del código comienza sólo cuando el generator se repite. 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 de rendimiento, la ejecución de la función se detiene. Vuelve generator objeto de vuelta a la persona que llama. La ejecución de la función comenzará sólo cuando el generator se ejecuta el objeto. 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 de rendimiento en Python funciona como un retorno con la única diferencia es que en lugar de devolver un valor, devuelve un generator función para la persona que llama.
  • A generator Es un tipo especial de iterador que, una vez utilizado, no volverá a estar disponible. Los valores no se almacenan en la memoria y solo están disponibles cuando se llaman.
  • Los valores del generator se puede leer usando los métodos for-in, list() y next().
  • La principal diferencia entre rendimiento y rendimiento es que el rendimiento regresa un generator funciona para la persona que llama y el retorno le da un valor único a la persona que llama.
  • 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.