CS🏅/파이썬 🖤

[Python] Iterator vs. Generator

Dobby98 2023. 3. 14. 22: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