Geradores Python: iteradores com eficiência de memória
Aprenda como usar geradores Python e instruções de rendimento para processar grandes conjuntos de dados com consumo mínimo de memória. Expressões do gerador mestre.
Visão geral
Ao escrever código que processa milhares ou milhões de registros, o gerenciamento de memória torna-se crítico. Se você carregar um conjunto de dados inteiro em uma lista, corre o risco de ficar sem RAM e travar o servidor. Os geradores Python resolvem esse problema fornecendo um mecanismo para transmitir dados sob demanda. Em vez de calcular e armazenar todo o conjunto de dados na memória de uma só vez, um gerador produz um item por vez, entrega-o ao chamador e pausa sua execução até que o próximo item seja solicitado.
Os geradores são definidos como funções normais, mas usam a palavra-chave `yield` em vez de `return`. Quando uma função geradora é chamada, ela retorna um objeto iterador gerador sem executar as instruções internas da função. Quando o chamador chama `next()` no gerador (ou faz um loop sobre ele), a função é executada até atingir `yield`. Nesse ponto, o gerador produz o valor, salva suas variáveis locais e suspende a execução. Quando chamado novamente, ele retoma exatamente de onde parou.
Você também pode criar geradores usando expressões geradoras, que usam uma sintaxe idêntica à compreensão de lista, mas entre parênteses `(...)` em vez de colchetes `[...]`. Isso torna incrivelmente fácil substituir compreensões de lista por iteradores com uso eficiente de memória. Ao evitar alocações massivas de memória, os geradores são indispensáveis para trabalhar com grandes logs, transmitir dados de bancos de dados ou realizar cálculos em sequências matemáticas de comprimento infinito.
Saída de código e execução
Um gerador personalizado que produz números de Fibonacci e uma expressão geradora com uso eficiente de memória.
def fibonacci_generator(limit):
"""Yields Fibonacci numbers up to the limit."""
a, b = 0, 1
count = 0
while count < limit:
yield a
a, b = b, a + b
count += 1
# Instantiate generator
fib = fibonacci_generator(5)
print("--- Using Generator Function ---")
for num in fib:
print(num)
# Generator expression (squares of numbers)
squares_gen = (x**2 for x in range(1, 1000000))
print("\n--- Using Generator Expression ---")
print(next(squares_gen))
print(next(squares_gen))
print(next(squares_gen))--- Using Generator Function ---
0
1
1
2
3
--- Using Generator Expression ---
1
4
9Implementação passo a passo
- Lendo arquivos linha por linha que são muito grandes para RAM
- Gerando uma sequência infinita de IDs ou números matemáticos
- Streaming de registros de banco de dados em lotes para processar chamadas de API
Perguntas frequentes
Qual é a diferença entre rendimento e retorno?
return encerra a função completamente. yield produz um valor e pausa a função, salvando seu estado para que ela possa ser retomada quando solicitada.
O que acontece quando um gerador fica sem itens?
Ele gera uma exceção StopIteration. Em um loop 'for', o Python intercepta automaticamente essa exceção para encerrar o loop de forma limpa.
Tópicos Relacionados
Aprenda como usar loops Python para iterar dados. Domine as práticas recomendadas para loops for, while loops, break, continue e loop com exemplos interativos.
Compreensões PythonEscreva um Python mais limpo e rápido. Lista mestre, dicionário e compreensão de conjuntos com exemplos práticos, condições de filtragem e loops aninhados.
Python ItertoolsAprenda o módulo itertools do Python. Domine iteradores infinitos, combinações, permutações, agrupamentos e processamento de dados com uso eficiente de memória.
Recursos Python recomendados
Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.
Como usar geradores em Python
Aprenda como escrever geradores em Python. Entenda a palavra-chave yield, avaliação lenta, otimização de memória e compare geradores com estruturas de lista.
Folha de dicas dos métodos de string Python
Um guia de referência completo para manipulação de strings em Python. Domine a formatação, pesquisa, divisão, substituição e verificação de propriedades de string.
Python vs JavaScript: qual linguagem de programação é a melhor?
Uma comparação abrangente entre Python e JavaScript. Explore diferenças de sintaxe, desempenho, casos de uso (backend versus frontend) e exemplos de codificação.