지연 평가(Lazy Evaluation)란?

Jiya·2025년 3월 8일

지연 평가(Lazy Evaluation)는 컴퓨터 프로그래밍에서 계산의 결과가 실제로 필요할 때까지 계산을 미루는 전략입니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다:

  1. 메모리 효율성: 모든 결과를 한 번에 메모리에 저장하지 않고, 필요할 때만 계산하기 때문에 메모리 사용량이 줄어듭니다.
  2. 성능 최적화: 실제로 사용되지 않는 계산은 수행하지 않기 때문에 불필요한 연산을 피할 수 있습니다.
  3. 무한 시퀀스 처리: 이론적으로 무한한 데이터 시퀀스도 처리할 수 있습니다.

Python에서 map() 함수의 예를 들어보겠습니다:

# 이 코드는 map 객체만 생성하고, 아직 실제 변환은 수행하지 않음
numbers = map(float, ["1", "2", "3", "4", "5"])

# 실제로 첫 번째 요소에 접근할 때 변환이 수행됨
first_number = next(numbers)  # 이 시점에 "1"이 float(1.0)으로 변환됨
이 코드는 map 객체만 생성하고, 아직 실제 변환은 수행하지 않음
numbers = map(float, ["1", "2", "3", "4", "5"])

# 실제로 첫 번째 요소에 접근할 때 변환이 수행됨
first_number = next(numbers)  # 이 시점에 "1"이 float(1.0)으로 변환됨

Python의 다른 지연 평가 예시:

제너레이터(Generators)
이터레이터(Iterators)
range() 함수 (Python 3)
filter() 함수
리스트 컴프리헨션과 대비되는 제너레이터 컴프리헨션

지연 평가의 반대는 즉시 평가(Eager Evaluation)로, 모든 계산이 즉시 수행되는 방식입니다. Python에서 list()로 이터레이터를 감싸면 즉시 평가가 수행되어 모든 요소가 메모리에 로드됩니다.

지연 평가 함수(map(), filter(), 제너레이터 등)의 결과를 리스트로 완전히 사용하려면 반드시 list()로 변환해야 합니다.
지연 평가 함수의 결과를 리스트로 변환하지 않으면:

인덱싱이 불가능합니다 (result[0] 같은 접근 불가)
길이 확인이 불가능합니다 (len(result) 불가)
여러 번 순회할 수 없습니다 (한 번 순회하면 이터레이터가 소진됨)
슬라이싱이 불가능합니다 (result[1:3] 불가)

따라서 지연 평가 결과를 리스트처럼 온전히 사용하려면:

result_list = list(map(float, input().split()))
result_list = list(filter(lambda x: x > 0, numbers))

이렇게 리스트로 변환해야 일반적인 리스트 연산을 모두 사용할 수 있습니다.

profile
코딩 공부 노트

0개의 댓글