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.

Experimente no Editor

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.

generators_demo.py
Experimente no Editor
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))
Saída terminal
--- Using Generator Function ---
0
1
1
2
3

--- Using Generator Expression ---
1
4
9

Implementaçã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

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.