ROKO

[Python] lazy evaluation 본문

Computer Science/Programming Language

[Python] lazy evaluation

RO_KO 2023. 3. 4. 14:39
728x90

generator는 lazy evaluation(지연 평가 구현체)이다. 즉 이미 구현을 해서 가지고 있는게 아닌 필요할때 그때그때 만들어서 보내주는 형식을 의미한다.

 

  • list같은 경우 print()를 했을때 내부 값이 전부 출력되게 되는데, 이미 내부 값들이 "평가"되어 있으며 구현된 상태로 container안에 들어가 있는 상태라는 뜻이다.
  • 반대로 generator로 표현되는 것들은 만약 값을 호출할때 어떻게 값을 만들어내고 어디서 어디까지 범위를 가지고 있는지, "평가"전에 데이터를 생성하는 방법을 기억하고 있는 상태이다.

 

generator는 반복해서 값을 생성할 수 있으므로 iterator라고도 불리는데 generator expression(generator comprehension) 또는 yield으로 생성되는 iterator를 generator라고 인식하면 편하다. generator는 모든 값을 기억하고 있지 않다는 면에서 memory관리 효율을 좋게 해준다. 데이터가 늘어나면 늘어날수록 언제 쓰일지 모르는데 메모리를 차지하는것보다 필요할때 주는것이 더 효율적이지 않을까? 물론 데이터가 상시로 바뀌는 상황이라면 generator가 꼭 좋지만은 않을 것이다. CS에서 유일한 답은 없고 상황에 따라 효율적인 방법은 달라진다.

 

next

genrator객체가 있을때 next()를 이용해 generator의 다음값을 얻을 수 있다.

gen = ( x**2 for x in range(3) )

print(next(gen))
#0
print(next(gen))
#1

yield

comprehension이 아닌 함수형식으로 generator를 만들 수 있다.

def my_gen():
    yield 1
    yield 2
    yield 3
    
gen = my_gen()
print(gen)

# <generator object my_gen at 0x7ff1e01b4350>

<중요> 어떤 함수 정의라도 내부에 yield가 있다면 그 함수는 실행시에 generator를 만들어낸다.

generator vs iterator

  • iterator는 모든 값을 순회로 내보내고도 언제든지 다시 값을 내보낼 수 있다.
  • genrator는 모든 값을 1번씩 출력한 이후에는 그 값을 기억하지 않아 다시 내보낼 수 없다.

generator값을 계속 출력해보면 stopiterator라면 error가 출력된다.

gen = my_gen()
print(next(gen))
# 0
print(next(gen))
# 1
print(next(gen))
# 2
print(next(gen))
# StopIteration
728x90

'Computer Science > Programming Language' 카테고리의 다른 글

[Python] map, filter  (0) 2023.03.04
[Python] Comprehension  (0) 2023.03.04
[Python] Error  (0) 2023.03.04
[Python] decorator  (0) 2023.03.04
Comments