Rendimento em Python Tutorial: Generator & Exemplo de rendimento vs retorno

Índice:

Anonim

O que é rendimento em Python?

A palavra-chave yield em python funciona como um retorno com o único

A diferença é que, em vez de retornar um valor, ele devolve um objeto gerador ao chamador.

Quando uma função é chamada e o thread de execução encontra uma palavra-chave de rendimento na função, a execução da função para naquela linha e retorna um objeto gerador de volta para o chamador.

Neste tutorial Python, você aprenderá:

  • O que é rendimento em Python?
  • Sintaxe
  • O que são geradores em Python?
  • Diferença entre a função normal v / s função do gerador.
  • Como ler os valores do gerador?
  • Os geradores são de uso único
  • Exemplo: Geradores e rendimento da Série Fibonacci
  • Exemplo: função de chamada com rendimento
  • Quando usar Yield em vez de Return em Python
  • Rendimento vs. Retorno

Sintaxe

yield expression

Descrição

O rendimento do Python retorna um objeto gerador. Geradores são funções especiais que precisam ser iteradas para obter os valores.

A palavra-chave yield converte a expressão dada em uma função geradora que retorna um objeto gerador. Para obter os valores do objeto, ele deve ser iterado para ler os valores dados ao rendimento.

Exemplo: Método de Rendimento

Aqui está um exemplo simples de rendimento. A função testyield () tem uma palavra-chave de rendimento com a string "Welcome to Guru99 Python Tutorials". Quando a função é chamada, a saída é impressa e fornece um objeto gerador em vez do valor real.

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

Resultado:

A saída fornecida é um objeto gerador, que possui o valor que demos para o rendimento.

Mas não estamos recebendo a mensagem que temos que dar para produzir resultados!

Para imprimir a mensagem dada ao yield terá que iterar o objeto gerador conforme mostrado no exemplo abaixo:

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

Resultado

Welcome to Guru99 Python Tutorials

O que são geradores em Python?

Geradores são funções que retornam um objeto gerador iterável. Os valores do objeto gerador são buscados um de cada vez em vez da lista completa juntos e, portanto, para obter os valores reais, você pode usar um loop for, usando o método next () ou list ().

Usando a função Gerador

Você pode criar geradores usando a função de gerador e usando a expressão de gerador.

Uma função geradora é como uma função normal, em vez de ter um valor de retorno, ela terá uma palavra-chave de rendimento.

Para criar uma função de gerador, você terá que adicionar uma palavra-chave de rendimento. Os exemplos a seguir mostram como criar uma função de gerador.

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

Resultado:

HELLO

Diferença entre a função normal v / s função do gerador.

Vamos entender como uma função geradora é diferente de uma função normal.

Existem 2 funções normal_test () e generator_test ().

Ambas as funções devem retornar a string "Hello World". O normal_test () está usando return e 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

Resultado:

Hello World

A saída mostra que, quando você chama a função normal normal_test (), ela retorna a string Hello World. Para uma função de gerador com palavra-chave de rendimento, ela retorna e não a string.

Esta é a principal diferença entre uma função de gerador e uma função normal. Agora, para obter o valor do objeto gerador, precisamos usar o objeto dentro do loop for ou usar o método next () ou fazer uso de list ().

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

Mais uma diferença a ser adicionada à função normal v / s função geradora é que quando você chama uma função normal, a execução começa e para quando retorna e o valor é retornado ao chamador. Portanto, quando a execução começa, você não pode parar a função normal no meio e ela só irá parar quando encontrar a palavra-chave return.

Mas no caso da função gerador, uma vez que a execução começa quando ela obtém o primeiro rendimento, ela para a execução e devolve o objeto gerador. Você pode usar o objeto gerador para obter os valores e também fazer uma pausa e retomar de acordo com sua necessidade.

Como ler os valores do gerador?

Você pode ler os valores de um objeto gerador usando um list (), for-loop e usando o método next ().

Usando: list ()

Uma lista é um objeto iterável que tem seus elementos entre colchetes. Usar list () em um objeto gerador fornecerá todos os valores que o gerador contém.

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

Resultado:

[0, 2, 4, 6, 8]

Usando: for-in

No exemplo, há uma função definida even_numbers () que fornecerá todos os números pares para os n definidos. A chamada para a função even_numbers () retornará um objeto gerador, que é usado dentro do loop for.

Exemplo:

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

Resultado:

02468

Usando next ()

O método next () fornecerá o próximo item na lista, array ou objeto. Uma vez que a lista está vazia, e se next () for chamado, ele retornará um erro com o sinal stopIteration. Este erro, de next () indica que não há mais itens na 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))

Resultado:

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

Os geradores são de uso único

No caso de geradores, eles estão disponíveis para uso apenas uma vez. Se você tentar usá-los novamente, ele ficará vazio.

Por exemplo:

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

Resultado:

02468Calling the generator again: []

Caso queira que a saída seja usada novamente, terá que fazer a chamada para funcionar novamente.

Exemplo: Geradores e rendimento da Série Fibonacci

O exemplo a seguir mostra como usar geradores e rendimento em Python. O exemplo irá gerar a série 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)

Resultado:

0112358

Exemplo: função de chamada com rendimento

Neste exemplo, veremos como chamar uma função com rendimento.

O exemplo abaixo tem uma função chamada test () que retorna o quadrado do número fornecido. Há outra função chamada getSquare () que usa test () com a palavra-chave yield. A saída fornece o valor quadrado para um determinado intervalo de números.

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)

Resultado:

0149162536496481

Quando usar Yield em vez de Return em Python

A palavra-chave Yield Python3 retorna um gerador para o chamador e a execução do código começa apenas quando o gerador é iterado.

Um retorno em uma função é o fim da execução da função e um único valor é devolvido ao chamador.

Aqui está a situação em que você deve usar Rendimento em vez de Retorno

  • Use rendimento em vez de retorno quando o tamanho dos dados for grande
  • O rendimento é a melhor escolha quando você precisa que sua execução seja mais rápida em grandes conjuntos de dados
  • Use yield quando quiser retornar um grande conjunto de valores para a função de chamada
  • O rendimento é uma forma eficiente de produzir dados grandes ou infinitos.

Rendimento vs. Retorno

Aqui estão as diferenças entre rendimento e retorno

Produção Retornar
Yield retorna um objeto gerador para o chamador, e a execução do código começa apenas quando o gerador é iterado. Um retorno em uma função é o fim da execução da função e um único valor é devolvido ao chamador.
Quando a função é chamada e encontra a palavra-chave yield, a execução da função é interrompida. Ele retorna o objeto gerador de volta ao chamador. A execução da função iniciará somente quando o objeto gerador for executado. Quando a função é chamada, a execução começa e o valor é devolvido ao chamador se houver a palavra-chave return. O retorno dentro da função marca o fim da execução da função.
expressão de rendimento expressão de retorno
Nenhuma memória é usada quando a palavra-chave yield é usada. A memória é alocada para o valor retornado.
Muito útil se você tiver que lidar com um grande tamanho de dados, pois a memória não é usada. Conveniente para tamanhos de dados muito pequenos.
O desempenho é melhor se a palavra-chave de rendimento for usada para grandes tamanhos de dados. Muita memória é usada se o tamanho dos dados for grande, o que prejudicará o desempenho.
O tempo de execução é mais rápido no caso de rendimento para grandes tamanhos de dados. O tempo de execução usado é maior porque há processamento extra feito no caso, se o tamanho dos seus dados for grande, funcionará bem para dados pequenos.

Resumo:

  • A palavra-chave yield em python funciona como um retorno com a única diferença é que em vez de retornar um valor, ela retorna uma função geradora para o chamador.
  • Um gerador é um tipo especial de iterador que, uma vez usado, não estará disponível novamente. Os valores não são armazenados na memória e só estão disponíveis quando chamados.
  • Os valores do gerador podem ser lidos usando o método for-in, list () e next ().
  • A principal diferença entre o rendimento e o retorno é que o rendimento retorna uma função geradora para o chamador e o retorno fornece um único valor para o chamador.
  • O rendimento não armazena nenhum dos valores na memória e a vantagem é que é útil quando o tamanho dos dados é grande, pois nenhum dos valores é armazenado na memória.
  • O desempenho é melhor se a palavra-chave yield for usada em comparação para retornar para um tamanho de dados grande.