- [Python] Iterator vs. Generator2023년 03월 14일
- Cat_Code
- 작성자
- 2023.03.14.:16
파이토치를 하다보면 특히, DataLoader 다루다보면 Generator 라는 것을 만나게 된다
처음 마주치면 어떠한 개념인지 살짝 애매할 수 있기 때문에
이번에 개념을 한번 글로 정리해보려고 한다
Iterator vs. Generator
Iterator
먼저 Iterator를 알아보자
iterate는 반복하다라는 의미이다
파이썬의 경우 list, dict, 문자열이 iterable 객체이다.
이를 이해하기 쉽게 예를 들어서 설명하면
x = [1 , 2, 3] list인 경우
순차적으로 값을 뽑기 위해서 for문을 활용할 것이다
fro i in [1,2,3]: print(i) >>> 1 2 3
그렇다면 for문을 활용하지 않고 각 값을 순차적으로 뽑을 수 있는 방법은 없을까?
바로 iter()를 활용하는 것이다a = [1,2,3,4] b = iter(a) print(next(b)) print(next(b)) print(next(b)) >>> 1 2 3
쉽게 말해서 iterable한 객체를 next를 활용해 값을 순차적으로 뽑을 수 있다
iterable한 객체가 되기위해서는 클래스가 2개의 메소드를 갖고 있어야한다
1. __iter__() #이터러블 객체 자신을 반환
2. __next__() #다음 반복을 위한 값을 반환, 더 이상 값이 없으면 예외 발생 - 멈춤
Generator
iterable한 객체를 생성하는 다른 방법이 있다
바로 Generator를 활용하는 것이다
Generator는 Iterator의 특수한 한 형태이다.
Generator는 yield문을 활용해서 구성한다
def generators(): yield 1 yield 2 yield 3 print(type(generators)) >> class generator
generator의 클래스도 내장함수로 next를 갖고 있기 때문에
next()를 활용해서 값을 순차적으로 가져올 수 있다
n = next(generators) print(n) n = next(generators) print(n) n = next(generators) print(n) >>> 1 2 3
그렇다면 둘의 차이점은 무엇일까?
쉽게 설명하자면 메모리에 올라가있는 상태가 다르다
list, dict 같이 iterable한 객체의 경우 이미 값이 모두생성 되어있다
하지만 generator의 경우 값이 모두 생성되어 있지 않고
호출할때 하나의 값씩 순차적으로 생성한다
즉, 이러한 generator의 경우 데이터가 너무 많거나, 효율적인 계산을 위할때 사용된다
이를 처음에서 말한 pytorch의 DataLoader에 적용해서 생각해보면
pytorch에서 모델을 학습할 때 모든 데이터를 메모리에 올릴 필요없이 Batch에 맞는 만큼 순차적으로 사용하면된다
따라서 DataLoader는 이러한 효율적인 계산을 위해서 generator로 생성된 것이다
'[CS] > 파이썬 🖤' 카테고리의 다른 글
[CS]CPU bound vs. I/O bound (0) 2023.06.08 [Python] Typing 2편 (0) 2023.05.31 [Python] Typing 1편 (0) 2023.05.30 [Python] 파이썬 데코레이터 (0) 2022.12.27 [Python] 간단한 class 정리 및 객체지향 프로그래밍 (1) 2022.12.26 다음글이전글이전 글이 없습니다.댓글