Rendimiento en Python Tutorial: Generator & Ejemplo de rendimiento frente a rendimiento

Tabla de contenido:

Anonim

¿Qué es el rendimiento de Python?

La palabra clave yield en Python funciona como un retorno con el único

La diferencia es que en lugar de devolver un valor, devuelve un objeto generador a la persona que llama.

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.

En este tutorial de Python, aprenderá:

  • ¿Qué es el rendimiento de Python?
  • Sintaxis
  • ¿Qué son los generadores en Python?
  • Diferencia entre la función normal y la función del generador.
  • ¿Cómo leer los valores del generador?
  • Los generadores son de uso único
  • Ejemplo: generadores y rendimiento para la serie Fibonacci
  • Ejemplo: función de llamada con rendimiento
  • Cuándo usar Yield en lugar de Return en Python
  • Rendimiento frente a retorno

Sintaxis

yield expression

Descripción

El rendimiento de Python devuelve un objeto generador. Los generadores 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, debe iterarse 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 yield con la cadena "Bienvenido a los tutoriales de Python de Guru99". Cuando se llama a la función, la salida se imprime y da un objeto generador en lugar del valor real.

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

Producción:

La salida dada es un objeto generador, que tiene el valor que le hemos dado a rendimiento.

¡Pero no estamos recibiendo el mensaje que tenemos que dar para obtener resultados!

Para imprimir el mensaje dado 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)

Producción

Welcome to Guru99 Python Tutorials

¿Qué son los generadores en Python?

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

Usando la función de generador

Puede crear generadores usando la función de generador y usando la expresión del generador.

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

Para crear una función de generador, deberá agregar una palabra clave de rendimiento. Los siguientes ejemplos muestran cómo crear una función de generador.

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

Producción:

HELLO

Diferencia entre la función normal y la función del generador.

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 devuelven la cadena "Hello World". Normal_test () está usando return y generator_test () está usando 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

Producción:

Hello World

La salida muestra que cuando llama a la función normal normal_test () devuelve la cadena Hello World. Para una función de generador con la palabra clave yield, devuelve y no la cadena.

Ésta es la principal diferencia entre una función de generador y una función normal. Ahora, para obtener el valor del objeto generador, 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 función generadora es que cuando llama a una función normal, la ejecución comenzará y se detendrá cuando vuelva y el valor se devuelva al llamador. Entonces, cuando comienza la ejecución, no puede detener la función normal en el medio y solo se detendrá cuando se encuentre con la palabra clave return.

Pero en el caso de la función del generador, 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 requisitos.

¿Cómo leer los valores del generador?

Puede leer los valores de un objeto generador usando un list (), for-loop y usando el método next ().

Usando: list ()

Una lista es un objeto iterable que tiene sus elementos entre paréntesis. El uso de list () en un objeto generador dará todos los valores que el generador tiene.

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

Producción:

[0, 2, 4, 6, 8]

Usando: for-in

En el ejemplo, hay una función definida even_numbers () que le dará todos los números pares para los n definidos. La llamada a la función even_numbers () devolverá un objeto generador, que se usa dentro del bucle for.

Ejemplo:

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

Producción:

02468

Usando next ()

El método next () le dará 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 xnum = even_numbers(10)print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))

Producción:

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

Los generadores son de uso único

En el caso de los generadores, solo están disponibles para su uso una vez. Si intenta usarlos nuevamente, estará vacío.

Por ejemplo:

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

Producción:

02468Calling the generator again: []

En caso de que desee volver a utilizar la salida, deberá realizar la llamada para funcionar nuevamente.

Ejemplo: generadores y rendimiento para la serie Fibonacci

El siguiente ejemplo muestra cómo usar generadores y rendimiento en Python. El ejemplo generará la serie de 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)

Producción:

0112358

Ejemplo: función de llamada con rendimiento

En este ejemplo veremos cómo llamar a una función con rendimiento.

El siguiente ejemplo tiene una función llamada test () que devuelve el cuadrado del número dado. Hay otra función llamada getSquare () que usa test () con la palabra clave yield. La salida da el valor cuadrado para un rango numérico dado.

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)

Producción:

0149162536496481

Cuándo usar Yield en lugar de Return en Python

La palabra clave Python3 Yield devuelve un 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 solo valor al llamador.

Aquí está la situación en la que debe usar Yield en lugar de Return

  • Use rendimiento en lugar de retorno cuando el tamaño de los datos es 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 frente a retorno

Aquí están las diferencias entre rendimiento y rendimiento.

Producir Regreso
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 solo valor al llamador.
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 a la persona que llama. La ejecución de la función comenzará solo cuando se ejecute el objeto generador. Cuando se llama a la función, comienza la ejecución 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 yield. La memoria se asigna por el valor devuelto.
Muy útil si tiene que lidiar con un gran tamaño de datos ya que la memoria no se usa. 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 es que en lugar de devolver un valor, devuelve una función generadora a la persona que llama.
  • Un generador 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 generador se pueden leer usando los métodos for-in, list () y next ().
  • La principal diferencia entre rendimiento y retorno es que rendimiento devuelve una función generadora a la persona que llama y return le da un valor único a la persona que llama.
  • El rendimiento no almacena ninguno de los valores en la memoria, y la ventaja es que es ú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 para datos de gran tamaño.