파이썬은 주로 데이터를 다룰 때 쓰는 프로그래밍 언어로 많이 쓰인다. 특히, 큰 양의 데이터를 다룰 때, CPU/Memory 등 하드웨어 리소스들을 신경쓰며 프로그래밍 해야하는 상황이 생기는데, 이럴 때 파이썬에 등장하는 키워드가 바로 제너레이터다.
이에 대해, 간략히 요약하여 기록해보려고 한다.
대부분의 글은 아래 링크를 참조했다. 좀 더 알고싶다면 아래 링크를 참조하면 된다.
이글은 핵심만 적는다.
참고 링크
제너레이터란?
한 마디로 말해, 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
'더 나은 엔지니어가 되기 위해 > 파이썬을 파이썬스럽게' 카테고리의 다른 글
python 멀티 프로세싱은 parmap 으로 하자. (15) | 2019.07.22 |
---|---|
pandas, 데이터 프레임 합치는 방법 중 뭐가 제일 빠를까 (0) | 2019.05.23 |
파이썬 정렬, 다중 조건으로 한 번에 하기. (8) | 2019.04.15 |
파이썬 Asterisk(*)에 대해서 (1) | 2019.04.04 |
파이썬을 파이썬 답게. (코딩 문제편) (0) | 2019.03.24 |