Generator란? | Python

유상준·2022년 9월 20일
0

iter()

  • iterable object를 iter() 함수에 넣어주게 되면 어떻게 될까?
fruits = [apple, banana, mango]
iter(fruits) # <list_iterator at 0x105d01910>
  • 메모리의 주소값을 반환해줄뿐, 값을 볼수는 없다.
    - 값을 보려면 ? 변수로 지정한 뒤, next() 이용
memory_address_fruits = iter(fruits)
print(next(memory_address_fruits)) # apple
print(next(memory_address_fruits)) # banana
print(next(memory_address_fruits)) # mango
  • 다음 메모리 주소만을 저장하고 값을 생성하게 된다. (나머지 메모리 주소는 알지 못함)

generator

  • iterable object의 특수한 사용법
    - yield 라는 명령어를 사용 (element를 하나씩 메모리에 return)
    - 객체를 하나씩 생성한다는 느낌으로
# 일반 리스트의 경우
def origin_list(number):
    tmp = []
    for i in range(number):
        tmp.append(i)
    return tmp
print(origin_list(4))
# [0, 1, 2, 3]
# generator의 경우
def generator_list(number):
    tmp = []
    for i in range(number):
        yield i
generator_list(4)
# <generator object generator_list at 0x106b64120>

뭐가 다른건데 ?

  • generator와 yield를 사용하면, 값을 한번에 메모리에 올리지 않고, 하나씩 호출해가며 생성하기 때문에, 훨씬 저용량으로 같은 데이터를 처리할 수 있다.
import sys
origin_size = origin_list(10)
generator_size = generator_list(10)
print(f"origin_list 사용시 용량 {sys.getsizeof(origin_size)}byte")
print(f"generator_list 사용시 용량 {sys.getsizeof(generator_size)}byte")

origin_list 사용시 용량 184byte
generator_list 사용시 용량 112byte

화장실에 여러명이 한 번에 들어가는것보다, 한 명이 나오면 한 명이 들어가는 방법을 사용하는것이 더 효율적인 것 처럼

generator comprehension (expression)

  • list comprehension과 비슷하지만, 대괄호 대신 소괄호를 써주는 차이
gen_compre = (n for n in range(10))
print(type(gen_compre))
# <class 'generator'>

정리

generator를 사용하는 경우

  • list 타입의 데이터를 반환해야 하는경우, 읽기 쉽고 중간과정에서 loop이 중단되어도 안정적으로 데이터를 가져올 수 있다.
  • 큰 데이터를 처리할 때는 generator comprehension(expression)을 생각해보자.
    - 메모리 과부화를 막을 수 있다.
  • 파일 데이터를 처리할 때도 generator를 사용하면 좋을 때가 있다.
profile
데이터 사이언티스트 지망생

0개의 댓글