상황파악

파이썬 - 제너레이터 (Generator) 본문

파이썬

파이썬 - 제너레이터 (Generator)

otch80 2021. 1. 4. 18:31

도대체 이건 뭔가싶어서 찾아봤다

 

A function which returns an iterator. It looks like a normal function except that it contains yield statements for producing a series of values usable in a for-loop or that can be retrieved one at a time with the next() function. Each yield temporarily suspends processing, remembering the location execution state (including local variables and pending try-statements). When the generator resumes, it picks-up where it left-off (in contrast to functions which start fresh on every invocation).

파이썬 공식문서의 제너레이터에 대한 정의다.

 

핵심만 뽑아보면 

 

generator = iterator를 반환하는 함수.

 

함수의 개념으로 설명하고 있다.

 

 

 

그렇다면 iterator는 무엇인가?

 

next() 메소드를 이용해 데이터에 순차적으로 접근이 가능한 object를 뜻한다고 한다.

 

즉, generator는 순차 접근이 가능한 객체를 반환하는 함수 라고 볼 수 있다.

 

 

조금 더 자세히 살펴보자

 

위 설명중 yield라는 부분이 있는데 이는 제너레이터를 반환하는 키워드라고 한다.

쉽게말해 yield에 선언된 명령을 수행하고 해당 값을 next()를 호출한 쪽으로 return하여 함수의 밖으로 데이터를 전달한 후 잔여 작업을 다시 실행된다고 한다. 약간 동기화의 개념과 비슷한 것 같다.

 

 

이렇게 복잡한 과정을 왜 사용하는 것일까?

이유는 제너레이터 함수가 동작하다 yield를 만나면 그 상태로 정지되며 next()를 호출한 쪽으로 return하게 되는데, 이러한 과정에서 함수 내부에 사용된 데이터가 메모리에 그대로 남아있다고 한다. 

 

 

아직까지 체감은 크게 못했지만 주변글을 읽어보면 특히 리스트를 사용할 때 사이즈가 커지면 메모리 사용량이 늘어나게 되는데 제너레이터를 사용하면 next() 동작으로 차례로 값에 접근하기 때문에 메모리를 접근하는 데이터의 크기만큼만 사용한다고 해서 굉장히 큰 작업을 하게 되면 메모리 사용이 비교적 줄어들게 되어 장점이 있다고 한다.

 

 

제너레이터 선언 방법은 ( ), 소괄호를 통해 선언할 수 있다.

출력은 print(next(gen)) 방식으로 한다고 한다.

혹은 반복문을 통해 출력할 수 있다.

 

예) for i in gen:

         print(i)

 

파이썬이 타 언어에 비해 쉽다고 하지만 이런 부분때문에 많은 사람들이 어려움을 겪는다고 한다.

쉽게 만들면 효율적이지 못하고, 활용성이 뛰어나면 어려운게 언어의 딜레마인것 같다.

'파이썬' 카테고리의 다른 글

파이썬 - 람다 (lambda)  (0) 2021.01.07
Python pandas 간단 설명  (0) 2019.11.30