Python 생성기: 메모리 효율적인 반복자

Python 생성기와 Yield 문을 사용하여 최소한의 메모리 공간으로 대규모 데이터세트를 처리하는 방법을 알아보세요. 마스터 생성기 표현식.

에디터에서 사용해 보세요

개요

수천 또는 수백만 개의 레코드를 처리하는 코드를 작성할 때 메모리 관리가 중요합니다. 전체 데이터세트를 목록에 로드하면 RAM이 부족해 서버가 충돌할 위험이 있습니다. Python 생성기는 요청 시 데이터를 스트리밍하는 메커니즘을 제공하여 이 문제를 해결합니다. 전체 데이터 세트를 한 번에 계산하고 메모리에 저장하는 대신 생성기는 한 번에 하나의 항목을 생성하여 호출자에게 양보하고 다음 항목이 요청될 때까지 실행을 일시 중지합니다.

생성기는 일반 함수처럼 정의되지만 `return` 대신 `yield` 키워드를 사용합니다. 생성기 함수가 호출되면 함수의 내부 명령문을 실행하지 않고 생성기 반복기 개체를 반환합니다. 호출자가 생성기에서 'next()'를 호출하면(또는 루프를 반복하면) 함수는 'yield'에 도달할 때까지 실행됩니다. 이 시점에서 생성기는 값을 생성하고 로컬 변수를 저장한 다음 실행을 일시 중지합니다. 다시 호출되면 정확히 중단된 부분부터 다시 시작됩니다.

또한 목록 이해와 동일한 구문을 사용하지만 대괄호 `[...]` 대신 괄호 `(...)`로 묶인 생성기 표현식을 사용하여 생성기를 만들 수도 있습니다. 이를 통해 목록 이해를 메모리 효율적인 반복자로 대체하는 것이 매우 쉽습니다. 대규모 메모리 할당을 피함으로써 생성기는 대규모 로그 작업, 데이터베이스에서 데이터 스트리밍 또는 무한 길이의 수학적 시퀀스에 대한 계산을 수행하는 데 필수적입니다.

코드 및 실행 출력

피보나치 수와 메모리 효율적인 생성기 표현식을 생성하는 사용자 정의 생성기입니다.

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
9

단계별 구현

  • RAM에 비해 너무 큰 파일을 한 줄씩 읽기
  • 무한한 ID 또는 수학 수치 시퀀스 생성
  • API 호출을 처리하기 위해 일괄적으로 데이터베이스 레코드 스트리밍

자주 묻는 질문

수익률과 수익률의 차이점은 무엇입니까?

return은 함수를 완전히 종료합니다. Yield는 값을 산출하고 함수를 일시 중지하여 요청 시 재개할 수 있도록 상태를 저장합니다.

생성기의 항목이 부족하면 어떻게 되나요?

StopIteration 예외가 발생합니다. 'for' 루프에서 Python은 루프를 깔끔하게 종료하기 위해 자동으로 이 예외를 가로챕니다.

관련 주제

권장 Python 리소스

관련 대화형 튜토리얼, 치트 시트, 코드 비교를 통해 지식을 확장하세요.