컴퓨터 프로그래밍에서 느긋한 계산법(Lazy Evaluation)은 계산의 결과 값이 필요할 때까지 계산을 늦추는 기법이다.
느긋하게 계산하면 필요없는 계산을 하지 않으므로 실행을 더 빠르게 할 수 있고, 복합 수식을 계산할 때 오류 상태를 피할 수 있고, 무한 자료 구조를 쓸 수 있고, 미리 정의된 것을 이용하지 않고 보통 함수로 제어 구조를 정의할 수 있다.
- 위키백과
사전적 의미는 위와 같이 '위키백과'에서 정의하고 있으나 쉽게 예를 들어서 설명하자면,
라면을 파는 식당을 운영하는 사람이라고 가정해보자.
식당에 10명이 예약을 했고 각각 라면 1개씩 총 10인분의 라면을 주문했다.
하지만, 예약자로부터 전화로 '몇 명의 사람이 참석할 지 안할지 모른다. 혹은 전부다 불참할 수도 있다.'
라고 한다고 하면 판매자는 두 가지 방법 중 하나를 선택해야 한다.
첫번째는 10인분의 라면을 미리 준비해서 끓여놓고 손님이 오면 바로 먹을 수 있게 하는 것.
두번째는 10인분의 라면을 준비만 해놓고 손님이 오면 당장 끓여서 준다.
예약은 10명을 받았지만 몇 명이 올지 모르는 상황이기 때문에 두번째 방법으로 준비하는 것이 좀 더 효율적이라고 생각되고 이것이 바로 Lazy Evaluation 이다.
Lazy Evaluation은 필요없는 계산을 하지 않고 계산의 결과 값이 실제로 쓰일때까지 그 값의 계산을 뒤로 미루는 방식이다.
다음은 첫번째 방법처럼 라면을 전부 미리 끓여놓는 방법 list comprehension.
그리고 두번째 방법 generator를 이용해 lazy evaluation을 사용했을 때 각각 어떤 차이가 있는지 비교하는 코드이다.
import time
L = [1, 2, 3]
def print_iter(iter):
for element in iter:
print(element)
def lazy_return(num):
print("sleep 1s")
time.sleep(1)
return num
print("comprehension_list=")
comprehension_list = [ lazy_return(i) for i in L ]
print_iter(comprehension_list)
print("generator_exp=")
generator_exp = ( lazy_return(i) for in L )
print_iter(generator_exp)
결과를 보면 comprehension을 사용했을 때는 'lazy_reuturn' 함수를 미리 3번 실행하여 값을 만들어 놓고 한번에 출력한다.
즉, 라면을 미리 주문받은 만큼 끓여놓고 한번에 손님들에게 나가는 방식이다.
두번째로 lazy evaluation 방식을 사용하면 generator_exp 값을 사용하는 순간에만 함수를 수행하게 된다.
라면을 손님이 오면 그 때 라면을 끓여서 제공하는 방식이다.