python에서 Generator는 일반적인 함수와 달리 스트림 출력을 위해 yield를 사용해 값을 한번에 하나씩 반환하는 함수이다.
이러한 Generator는 동기 뿐만 아니라 비동기적으로 작동이 가능하며 AsyncGenerator를 이용해 사용가능하다.
Generator는 데이터 스트림을 처리하거나 큰 데이터를 메모리 효율적으로 처리가 가능하다.
AsyncGenerator는 비동기 흐름에서 데이터를 처리할 수 있으며 async for 와 await을 통해 작업을 실행한다.
Generator 함수의 내부 로직을 모듈화하는 이유는?
단순히 Generator 내부에서 하나의 로직을 통해 처리하면 상관이 없지만 여러 작업이 하나의 함수 내부에 포함되거나
분기문으로 여러 조건에 따른 결과를 출력한다면 하나의 Generator 함수가 복잡해지고 가독성과 유지보수가 어려워질 수 있다.
그리고 반복적인 작업을 여러번 작성할 가능성이 있기 때문에 알아두면 나쁘지 않을것 같다.
동기 흐름에서 Generator의 모듈화에 대해 설명한다.
def generator():
data = [1, 2, 3]
for item in data:
yield item * 2
위 코드는 data 리스트의 데이터의 두 배 값을 출력하는 Generator 함수이다.
이를
# 반복 로직 분리
def process_items(data):
for item in data:
yield item * 2
# 제너레이터 함수
def generator():
data = [1, 2, 3]
yield from process_items(data)
위와 같이 분리가 가능하다.
모듈화가 필요한 부분을 함수로 작성하고 이를 yield from으로 간단하게 모듈화가 가능하다.
예제.
def double_items():
data = [1, 2, 3]
yield from process_items(data)
def triple_items():
data = [1, 2, 3]
yield from process_items(item * 1.5 for item in data)
print("Double items:")
for value in double_items():
print(value) # 2, 4, 6
print("\nTriple items:")
for value in triple_items():
print(value) # 3.0, 6.0, 9.0
yield from은 동기 흐름에서만 사용이 가능하다.
AsyncGenerator는
# 반복 로직 분리
async def process_items(data):
for item in data:
await asyncio.sleep(1)
yield item * 2
# 제너레이터 함수
async def async_generator():
data = [1, 2, 3]
async for value in process_items(data):
yield value
다음과 같이 async for를 통해서 구현해야한다.
예제.
async def double_items():
data = [1, 2, 3]
async for value in process_items(data):
yield value
async def filtered_double_items():
data = [1, 2, 3]
async for value in process_items(data):
if value > 4: # 필터링 조건
yield value
async def main():
print("Double items:")
async for value in double_items():
print(value) # 2, 4, 6
print("\nFiltered double items:")
async for value in filtered_double_items():
print(value) # 6
asyncio.run(main())
사실 단순한 코드를 예시로 들어서
굳이 이렇게 사용해야 하나? 라는 생각이 드는데 사실 맞다
최대한 비동기 처리 구문과 제너레이터를 복잡하게 작성안하는 것이 좋지만
큰 데이터를 처리해야하는 경우나 비동기 작업이 많은 경우에는 한번에 처리하면 메모리에 부하를 줄 수 있기 때문에
효율적인 코드 작성을 위해 필요한 경우도 있을 수 있다.
항상 코드를 작성할 때마다 이게 맞나? 라는 생각이 중요한 것 같다.
'A.I.(인공지능) & M.L.(머신러닝) > Python' 카테고리의 다른 글
[python] 이미지 임베딩 후 검색엔진에 저장까지_elastic/opensearch (1) | 2024.06.04 |
---|---|
[python] 원하는 이미지 데이터셋을 만들고싶은데, 귀찮을 때 (0) | 2024.05.29 |
[실습] Python3.x 다른 python file import 하기 (0) | 2024.04.04 |
[실습] 01. numpy (0) | 2024.02.27 |
* 코사인 유사도란? (0) | 2023.10.28 |