lazy evaluation

lentos·2020년 6월 1일
0

lazy evaluation?

L = [ 1,2,3]

def generate_square_from_list():
    result = ( x*x for x in L )
    print(result)
    return result

def print_iter(iter):
    for element in iter:
        print(element)

print_iter( generate_square_from_list() )

데이터에 순차적인 접근이 가능한 generator 표현식이다. generator 함수는 일반 함수의 return(반환) 후 종료와는 달리 yield(산출) 후 현 상태에 머문다는 차이가 있다. 주로 iter 함수(다음 차례의 순번을 전달)와 next 함수(다음 순번의 값을 출력)를 통해 제어한다. lazy evaluation은 generator 함수에서 함수 호출 시에만 실행이 되도록 의도적으로 연산을 지연시키는 표현 방식이다.

lazy evaluation의 장점

함수를 호출 했을 때 연산을 해두고 결과값을 이용하지 않는 경우 메모리의 낭비가 일어난다. 이렇게 사용하지 않을 불필요한 연산으로 리소스가 낭비되는 것을 방지하기 위해 lazy evaluation을 사용하게 되면 generator가 사용 됐을 경우에만 generator가 진행하게 된다.

list comprehension과 lazy evaluation의 차이점

list comprehension

import time
import random

counter = random.randrange(1, 11)  # 1부터 10사이의 랜덤 값 생성
print("counter: {}".format(counter))

def return_one_after_five_sec():
    print("please wait for 5 seconds")
    time.sleep(5)
    print("return 1")
    return 1

print("[let's make one_list !]")
one_list = [return_one_after_five_sec() for x in range(10)]

# counter 숫자만큼 값 출력
print("[let's print one_list !]")
for item in one_list:
    counter -= 1
    print(item)
    if counter == 0:
        break

결과값

counter: 1

[let's make one_list !]
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1

[let's print one_list !]
1

Process finished with exit code 0

lazy evaluation

import time
import random

counter = random.randrange(1, 11)  # 1부터 10사이의 랜덤 값 생성
print("counter: {}".format(counter))

def return_one_after_five_sec():
    print("please wait for 5 seconds")
    time.sleep(5)
    print("return 1")
    return 1

print("[let's make one_generator !]")
one_generator = (return_one_after_five_sec() for x in range(10))  # generator 생성

# counter 숫자만큼 값 출력
print("[let's print one_generator !]")
for item in one_generator:
    counter -= 1
    print(item)
    if counter == 0:
        break

결과값

counter: 1
[let's make one_generator !][let's print one_generator !]
please wait for 5 seconds
return 1
1

list comprehension의 경우 뒤 쪽 출력 함수에 상관없이 10개의 리스트 값을 넘겨줬지만 lazy evaluation의 경우 뒤 쪽 출력 함수에서 리스트 값을 하나만 불러왔기 때문에 1개의 리스트 값만 넘겨주고 함수 연산을 지연했다.

0개의 댓글