- 개요
컴퓨터에서 사용하는 병행성(Concurrency)과 병렬성(Parallelism)의 개념은 다음과 같다
- 병행성 : 단일 프로그램에서 여러 작업을 동시에 수행
- 병렬성 : 여러 컴퓨터에서 여러 작업을 동시에 수행
이때 제네레이터를 사용하면 yield 키워드를 사용하여 병행성을 구현할 수 있다
1) generator를 사용한 병행성 작업 예시
def gen_ex1():
print('Start')
yield 'First Step'
print('Continue')
yield 'Second Step'
print('End')
tmp = iter(gen_ex1())
# 첫 번째 사용예시
print(next(tmp))
print(next(tmp))
print(next(tmp))
# 두 번째 사용예시
for t in gen_ex1():
print(t)
위와 같이 코드를 작성하였다
yield 키워드를 사용하여 각기 다른 상태를 저장하는 방식으로 여러 작업을 동시에 처리할 수 있다

next 함수를 통해 iterator로부터 값을 가져와 사용한다
단, 마지막 코드에서 더 이상 값을 가져올 수 없어 StopIteration 예외가 발생한다

for문을 사용하는 경우 StopIteration 예외에 대한 처리가 자동으로 이뤄진다
따라서 위와 같은 결과를 얻을 수 있다
2) itertools 모듈
itertools 모듈은 내장 모듈로서, iterator를 유용하게 사용할 수 있는 함수들을 제공한다
2 - 1) count 함수
# count 함수 : 인자로 시작값 / 증감값을 사용
gen1 = itertools.count(1, 2.5)
print(next(gen1))
print(next(gen1))
count 함수는 시작값부터 시작하여 증감값을 더하여 값을 반환한다
이때 반환된 iterator 객체로부터 next 함수를 사용하여 값을 추출할 수 있다

실행결과는 위와 같다
2 - 2) takewhile 함수
takewhile 함수 : 조건이 참일때까지 iterable의 요소에 접근
gen2 = itertools.takewhile(lambda n : n < 15, itertools.count(1, 3))
for v in gen2:
print(v)
takeawhile 함수는 조건이 참일 때까지 iterable한 객체의 요소에 접근하는 함수이다
조건은 람다를 사용하여 지정한다

실행 결과는 위와 같다
2 - 3) filterfalse 함수
# filterfalse 함수 : 조건이 거짓이 될때까지 iterable의 요소에 접근
gen3 = itertools.filterfalse(lambda n : n < 3, [1, 2, 3, 4, 5])
for v in gen3:
print(v)
filterfalse 함수는 조건이 거짓일 때까지 iterable한 객체의 요소에 접근하는 함수이다
마찬가지로 람다를 사용하여 조건을 지정한다

실행 결과는 위와 같다
2 - 4) accumulate 함수
# accumulate 함수 : 누적 합계
gen4 = itertools.accumulate([x for x in range(1, 11)])
for v in gen4:
print(v)
accumulate 함수는 iterator 객체로부터 누적합을 반환하는 함수이다

실행결과는 위와 같다
2 - 5) chain 함수
# chain 함수 : iterable 객체를 서로 연결
gen5 = itertools.chain('ABCDE', range(1, 11, 2))
print(list(gen5))
gen6 = itertools.chain(enumerate('ABCDE'))
print(list(gen6))
chain 함수는 iterable한 객체를 서로 연결하는 함수이다
예시에서는 하나로 연결된 객체를 list 형태로 출력한다

실행결과는 위와 같다
2 - 6) product 함수
# product 함수 : 개별 튜플로 분리
gen7 = itertools.product(enumerate('ABCDE'))
print(list(gen7))
# repeat 인자를 설정하여 개별 분리되는 튜플 내부의 데이터 개수를 설정
gen8 = itertools.product(enumerate('ABCDE'), repeat=2)
print(list(gen8))
product 함수는 iterable한 객체의 원소를 짝지어 튜플로 분리하는 함수이다
또 repeat 인자를 사용하여 분리된 튜플 내부의 데이터 개수를 설정할 수 있다

실행결과는 위와 같다
2 - 7) groupby 함수
# groupby 함수 : 그룹화
gen9 = itertools.groupby('AAABBBCCCDDD')
for chr, group in gen9:
print(chr, ' : ', list(group))
groupby 함수는 iterable한 객체를 key 함수를 통해 연속적인 그룹으로 묶어서 반환하는 함수이다

실행결과는 위와 같다
'Python > 파이썬 심화' 카테고리의 다른 글
| 코루틴 (2) (0) | 2025.10.12 |
|---|---|
| 코루틴 (1) (0) | 2025.10.12 |
| 병행성 - 기본 (2) (0) | 2025.09.14 |
| 병행성 - 기본 (1) (0) | 2025.09.14 |
| 데코레이터 (0) | 2025.09.02 |