Lazy Evaluation?
컴퓨터 프로그래밍에서 느긋한 계산법(Lazy evaluation) 혹은 call-by-need 이라고 부릅니다. 계산의 결과값이 필요할 때까지 계산을 늦추는 기법입니다. 필요없는 계산을 하지 않으므로 다음과 같은 이점이 있습니다.
1.
실행을 더 빠르게 할 수 있음
2.
복합 수식을 계산할 때 오류 상태를 피할 수 있음
3.
무한 자료 구조를 쓸 수 있음
4.
미리 정의된 것을 이용하지 않고 보통 함수로 제어 구조를 정의할 수 있음
위의 내용을 보다 간결하게 이해하기 위해서 코드를 작성해보도록 하겠습니다.
list comprehension
list comprehension 을 이용한 방법으로 코드를 작성할 때의 연산 순서를 살펴보면 다음과 같습니다.
1.
반복문 내에서 task() 가 한 번씩 불러온 후 리스트 생성
2.
생성된 normal 변수 내의 리스트 값을 반복문으로 출력
이때 배열을 생성하는 부분에서 시간을 소요하게 되고, 배열이 완성되어야 로직을 실행할 수 있다는 단점이 있습니다.
import time
def task(variable: int) -> int:
time.sleep(1)
print(f"Sleep 1 seconds...")
return variable + 1
print("------------------------------------")
normal = [task(i) for i in range(3)]
print("------------------------------------")
for v in normal:
print(v)
""" [ output ]
------------------------------------
Sleep 1 seconds...
Sleep 1 seconds...
Sleep 1 seconds...
------------------------------------
1
2
3
"""
Python
복사
generator_exp
generator를 이용하여 lazy evaluation 형태로 코드를 작성하면 다음과 같이 연산 과정을 가지게 됩니다.
1.
generator 변수 내에 < generator object >를 생성
2.
반복문 실행 시 순차적으로 task()를 실행하고 출력함
위와 같은 과정의 연산 과정을 가지게 되면, 필요한 부분에서만 task() 함수를 실행하도록 만들 수 있습니다. 즉, 필요할 때 연산을 수행하도록 로직을 구성할 수 있어 보다 효율적으로 연산을 수행할 수 있습니다.
import time
def task(variable: int) -> int:
time.sleep(1)
print(f"Sleep 1 seconds...")
return variable + 1
print("------------------------------------")
generator = (task(i) for i in range(3))
print("------------------------------------")
for g in generator:
print(g)
""" [ output ]
------------------------------------
------------------------------------
Sleep 1 seconds...
1
Sleep 1 seconds...
2
Sleep 1 seconds...
3
"""
Python
복사
Generator Exp
•
generator란 iterator를 생성해주는 함수(function) 이라고 말할 수 있습니다.
•
iterator 란 next() 메소드를 이용하여 데이터를 순차적으로 접근 가능한 object 입니다.
generator는 즉, 여러 개의 데이터를 미리 만들어두지 않고 필요할 때마다 생성하여 사용하는 객체를 의미합니다. python에서는 소괄호를 이용하여 generator 를 쉽게 직관적으로 작성하는 방법이 있고, yield를 이용하여 generator 함수를 만들 수 있습니다.
parentheses
print((i for i in range(10)))
""" [ output ]
<generator object <genexpr> at 0x7f6dc676ab30>
"""
Python
복사
yield
def generator(n):
i = 0
while i < n:
yield i
i += 1
print(generator(10))
for g in generator(10):
print(g)
""" [ output ]
<generator object generator at 0x7fa702211b30>
0
1
2
3
4
5
6
7
8
9
"""
Python
복사