Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> python

Tutorial de Rendimiento en Python:Generador y Rendimiento vs Ejemplo de Retorno

¿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 subproceso 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 objeto generador a la persona que llama.

En este tutorial de Python, aprenderá:

Sintaxis

yield expression

Descripción

Python yield 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

Aquí hay un ejemplo simple de rendimiento. La función testyield() tiene una palabra clave de rendimiento con la cadena "Bienvenido a los tutoriales de Guru99 Python". Cuando se llama a la función, la salida se imprime 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 recibiendo el mensaje que tenemos que dar para producir 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)

Salida

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 de uno en uno en lugar de la lista completa y, por lo tanto, para obtener los valores reales, puede usar un ciclo for, usando el método next() o list().

Uso de la función Generador

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

Una función de generador 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)

Salida:

H
E
L
L
O

Diferencia entre la función Normal y la función 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() usa return y generator_test() usa 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 llamas 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.

Esta 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 frente a la función generadora es que cuando llama a una función normal, la ejecución comenzará y se detendrá cuando llegue a return 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 se encuentre con la palabra clave de retorno.

Pero en el caso de la función de 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 una lista(), un ciclo for y usando el método next().

Usando:lista()

Una lista es un objeto iterable que tiene sus elementos entre corchetes. Usar list() en un objeto generador dará 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 :for-in

En el ejemplo, hay una función definida even_numbers() que le dará todos los números pares para el n definido. La llamada a la función even_numbers() devolverá un objeto generador, que se usa dentro del ciclo 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 dará el siguiente elemento en 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

Los generadores son de un solo uso

En el caso de los generadores, están disponibles para su uso una sola vez. Si intenta volver a usarlos, 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, deberá realizar la llamada para que funcione de nuevo.

Ejemplo:generadores y rendimiento para la serie de 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, 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:función de llamada con rendimiento

En este ejemplo veremos como llamar a una función con yield.

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 el rango de números dado.

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 La palabra clave devuelve un generador a la persona que llama 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 a la persona que llama.

Esta es la situación en la que debe usar Yield en lugar de Return

Rendimiento frente a rentabilidad

Aquí están las diferencias entre rendimiento y retorno

Rendimiento Volver
Yield devuelve un objeto generador a la persona que llama, 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 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 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, 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 usa memoria cuando se usa la palabra clave yield. La memoria se asigna para el valor devuelto.
Muy útil si tiene que lidiar con un gran tamaño de datos ya que la memoria no se utiliza. Conveniente para tamaños de datos muy pequeños.
El rendimiento es mejor si la palabra clave yield se usa para datos de gran tamaño. Se usa mucha memoria si el tamaño de los datos es enorme, lo que dificultará 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 un tamaño de datos pequeño.

Resumen:


python

  1. Python Anónimo/Función Lambda
  2. Generadores de Python
  3. Cierres Python
  4. Decoradores de pitón
  5. Python String strip() Función con EJEMPLO
  6. Longitud de cadena de Python | método len() Ejemplo
  7. Funciones Python Lambda con EJEMPLOS
  8. Función Python round() con EJEMPLOS
  9. Función Python map() con EJEMPLOS
  10. Contador de Python en colecciones con ejemplo
  11. Función Enumerate() en Python:Bucle, Tupla, Cadena (Ejemplo)