일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프레딧
- node.js
- NLinear
- 도커로 깃블로그 만들기
- 흥미붙이기
- 불법마약특별단속 #부산지방경찰청
- DL
- express
- DataProcessing
- transformer
- YOLO
- 제발쉽게좀가르치자
- DLInear
- 오토트레이딩
- socket.io
- TimeSeries
- 프로바이오틱스
- 엠프로
- de
- RL
- 강화학습으로주식하기
- 벨만방정식
- mlflow
- ML
- LTSF
- HY7714
- MPRO
- 강화학습
- AI
- pandas
- Today
- Total
상황파악
파이썬 - 제너레이터 (Generator) 본문
도대체 이건 뭔가싶어서 찾아봤다
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 |