제너레이터(Generator)

영선·2024년 11월 10일

Python

목록 보기
4/4

제너레이터(generator)는 이터레이터의 한 종류로, 값을 한 번에 모두 생성하는 대신, 필요한 순간에 값을 하나씩 생성해 메모리 효율적으로 데이터를 처리할 수 있습니다. 이터러블 객체와 유사하게 순회 가능한 특성을 갖고 있지만, 한 번 생성된 값을 재사용하지 않는다는 특징이 있습니다.

제너레이터의 특징 및 동작 방식

  1. lazy evaluation(지연 평가):

    • 제너레이터는 모든 값을 미리 생성하지 않고, 호출될 때마다 값을 하나씩 생성해 메모리 소비를 최소화합니다. 큰 데이터셋을 처리할 때 유용합니다.
  2. yield 키워드 사용:

    • 제너레이터 함수는 yield 키워드를 사용해 값을 반환합니다. yield를 만나면 함수의 상태가 일시 정지되고, 다시 호출하면 정지된 상태에서 이어서 실행됩니다. 따라서 제너레이터는 함수를 중단했다가 다시 실행하는 특징을 가집니다.
  3. 한 번만 사용 가능:

    • 제너레이터 객체는 한 번 순회하면 종료됩니다. 다시 순회하고자 한다면 새로운 제너레이터를 생성해야 합니다.

제너레이터 예제 코드

def simple_generator():
    yield 1
    yield 2
    yield 3

gen = simple_generator()
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3

위 코드에서 simple_generator() 함수는 yield 키워드를 사용해 값을 하나씩 반환합니다. next()를 통해 호출할 때마다 다음 yield문까지 실행되고 멈춥니다.

제너레이터를 사용하는 이유

  1. 메모리 효율성:

    • 리스트나 튜플은 모든 데이터를 메모리에 올려두기 때문에 데이터가 클 경우 메모리 사용량이 증가합니다. 반면, 제너레이터는 필요할 때 값을 생성해 메모리를 절약할 수 있습니다.
  2. 복잡한 데이터 처리를 단순화:

    • 제너레이터는 복잡한 데이터 생성 로직을 단순화하고, 하나씩 값을 생성해 반환하므로 코드가 간결해집니다.
  3. 무한 시퀀스 생성 가능:

    • 제너레이터는 종료 조건 없이 값을 무한히 생성할 수 있어, 예를 들어 무한 수열이나 무한 반복 처리가 가능합니다.

제너레이터 표현식

제너레이터는 리스트 컴프리헨션과 유사한 구문인 제너레이터 표현식을 통해 간결하게 작성할 수 있습니다. 리스트 컴프리헨션처럼 보이지만, 소괄호를 사용해 메모리에 모든 데이터를 생성하지 않고 하나씩 처리합니다.

gen_exp = (x * x for x in range(10))
print(next(gen_exp))  # 0
print(next(gen_exp))  # 1
print(next(gen_exp))  # 4

제너레이터와 이터레이터의 차이점 정리

항목이터레이터제너레이터
생성 방식__iter____next__ 메서드 구현함수 내 yield 키워드 사용
메모리 사용전체 값 메모리에 저장필요한 시점에 값 생성
순회 가능 횟수여러 번 가능한 번만 가능

제너레이터는 데이터 처리가 많거나, 메모리 효율성을 극대화해야 하는 상황에서 특히 유용한 기능입니다.

0개의 댓글