boost-devs / peer-session

🚀 부스트캠프 AI Tech 1기 U-Stage 4조 피어 세션 자료/질문 모음 (archived)
8 stars 2 forks source link

[히스] Generator 코드의 yield #10

Closed CoodingPenguin closed 3 years ago

CoodingPenguin commented 3 years ago

🙌 질문자


❓ 질문 내용


📄 참고 자료


CoodingPenguin commented 3 years ago

이 사이트에 설명이 잘 되어 있어서 첨부합니다!

https://realpython.com/introduction-to-python-generators

CoodingPenguin commented 3 years ago

일단 제너레이터를 이해하기 위해서는 다음과 같은 용어를 알아야 합니다!


⚔ Iterable vs Iterator

이 둘은 객체입니다. 비슷해보이지만 이 둘은 다른 객체입니다.

Iterable 객체는 iter 함수에 인자로 전달 가능한, 반복 가능한 객체를 말합니다.

Iterator 객체는 iter 함수가 생성해서 반환하는 객체를 말합니다.

next()와 iter() 함수는 앞의 내용에서 보셨다 싶이 Iterable 객체를 인자로 넣어서 Iterator 객체를 반환하는 것이 iter()이며, next()는 호출할 때마다 Iterable를 돌면서 요소를 하나씩 반환합니다.


❗❓ 그럼 제너레이터는 무엇인가요?

제너레이터는 Iterator 객체의 일종입니다. 제너레이터는 2가지 방식으로 생성할 수 있습니다.

방법1. yield와 함수

def generator_list(value):
    for i in range(value):
        # 값을 반환하고 여기를 기억
        yield i

방법 2. 표현식

value = 2
gen = (i for i in range(value))
print(next(gen))    # 0
print(next(gen))    # 1
print(next(gen))    # StopIteration 에러 발생

👍 그럼 왜 리스트보다 제너레이터가 메모리 상으로 더 좋을까?

리스트를 사용하면 리스트의 크기만큼 메모리에 공간이 할당됩니다. 반면 제너레이터는 말그대로 next 함수로 호출될 때 값을 생성하고 해당 값만 메모리에 올립니다! 즉, 메모리를 절약할 수 있습니다.

작은 데이터라면 상관없지만 큰 데이터에서는 제너레이터 사용이 필수이게 됩니다. 몇 GB 데이터를 메모리로 올린다면 상당히 무리가 가게 됩니다. 그래서 특히 큰 데이터에서는 제너레이터가 필수입니다.


CoodingPenguin commented 3 years ago

해당 내용은 제 블로그에 올려놓았습니다!

추가로 김재열 조교님(Jerry님)께서 올리신 자료도 같이 보시면 좋을 것 같습니다! 특히 Python이 메모리를 어떻게 사용하고 있는지에 대한 내용도 있어서 좋네요.

CoodingPenguin commented 3 years ago

제너레이터의 CPython 구현이 어떻게 되어있는지는 아래 링크를 참고하시면 좋을 것 같습니다.

Heeseok-Jeong commented 3 years ago

재밌네요! 펭귄님 덕에 배워갑니다 ㅎㅎ 감사합니다!