본문 바로가기

더 나은 엔지니어가 되기 위해/파이썬을 파이썬스럽게

파이썬 제너레이터 간단 정리

파이썬은 주로 데이터를 다룰 때 쓰는 프로그래밍 언어로 많이 쓰인다. 특히, 큰 양의 데이터를 다룰 때, CPU/Memory 등 하드웨어 리소스들을 신경쓰며 프로그래밍 해야하는 상황이 생기는데, 이럴 때 파이썬에 등장하는 키워드가 바로 제너레이터다.
이에 대해, 간략히 요약하여 기록해보려고 한다.

대부분의 글은 아래 링크를 참조했다. 좀 더 알고싶다면 아래 링크를 참조하면 된다.
이글은 핵심만 적는다.

참고 링크

[번역] 이터레이터와 제너레이터

python generator(제너레이터) 란 무엇인가

제너레이터란?

한 마디로 말해, yield 구문을 갖고있으면서 이터레이터를 반환하는 함수다.

def A(n):
  i = 0
  while i < n:
    yield i
    i += 1

이 때, 이터레이터란, next() 메쏘드를 통해 데이터에 순차적으로 접근이 가능한 객체를 말한다.
yield 는 값을 함수 진행중 멈추어, 해당 값을 호출한 곳에 내보낸 뒤, 다시 함수를 진행하는 역할을 한다.

다음의 키워드들이 제너레이터를 기억하기 좋은 것 같다.

  • 함수
  • 이터레이터를 반환
  • yield

제너레이터의 특징은?

메모리 효율성

가장 대표적으로 비교할 수 있는 자료구조가 리스트인데, 리스트는 데이터를 한 번에 메모리에 적재하기 때문에, 메모리 부족현상이 일어나, 프로그램이 갑자기 죽을 수 있다.

반면, 제너레이터는 값에 데이터에 접근할 때 마다 메모리에 적재하기 때문에, 큰 데이터를 다루는 경우, 리스트보다 안정적이고, 효율적이다.

게으른 연산

이 역시 리스트와 비교할 수 있는데, 리스트의 경우 리스트 컴프리핸션을 수행할 때, 리스트의 모든 값을 먼저 수행하기 때문에, 수행되는 연산이 오래걸리거나, 연산된 값에 접근하는 시간이 걸린다.

반면, 제너레이터는 그 때 그 때 yield 로 통해 값에 접근하기 때문에, 수행 시간이 긴 연산을 필요한 순간까지 늦출 시 있다는 점이 장점이다.

다음의 예시를 기억하면 좋을 듯 하다.

def sleep_func(x):
    print "sleep..."
    time.sleep(1)
    return x
# list
list = [sleep_func(x) for x in xrange(5)]
for i in gen:
    print i

# output
sleep...
sleep...
sleep...
sleep...
sleep...
0
1
2
3
4
# generator
gen = (sleep_func(x) for x in xrange(5))
for i in gen:
    print i

# output
sleep...
0
sleep...
1
sleep...
2
sleep...
3
sleep...
4

출처: https://bluese05.tistory.com/56