Search

Lazy Evaluation & Generator

카테고리
Programming
태그
Python
게시일
2022/11/16
수정일
2024/02/24 09:41
시리즈
python_syntax
1 more property

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
복사