대용량 데이터 처리를 할 때, 병렬처리를 이용하면 연산 속도를 줄일 수 있다.
딥러닝 프레임워크인 tensorflow나 pytorch 등의 경우 학습 과정에서 병렬처리 기능을 제공하지만, python의 경우 따로 기능을 제공하지 않는다.
이 때 python의 multiprocessing 라이브러리를 이용할 수 있다.
1. 함수 인자가 1개인 경우 병렬처리
- multiprocessing 라이브러리의 pool.map을 이용하면 병렬처리를 할 수 있다.
- https://ahnty0122.tistory.com/12
전에 썼던 글에 함수 인자가 1개인 경우 병렬처리를 할 수 있는 코드를 작성해두었다.
2. 함수 인자가 2개인 경우 병렬처리
- pool.starmap에서 zip 으로 함수 인자 처리
import multiprocessing
from functools import partial
from contextlib import contextmanager
우선 필요한 모듈 임포트
# 필요없는 낭비 없애기 위해 pool terminate도 필요
@contextmanager
def poolcontext(*args, **kwargs):
pool = multiprocessing.Pool(*args, **kwargs)
yield pool
pool.terminate()
# 사용자 함수 정의
def printname(arg1, arg2):
print(arg1, arg2)
if __name__ == '__main__':
arg1 = ['1', '2', '3']
arg2 = ['A', 'B', 'C']
# processes는 cpu 코어 개수
with poolcontext(processes = 16) as pool:
result = pool.starmap(printname, zip(arg1, arg2))
print(result)
위와 같은 형식으로 함수를 정의해 arg1, arg2 여러개의 인자에 대해 병렬처리를 적용할 수 있다.
결과
1 A
2 B
3 C
+++++ processes의 숫자를 정할 때, cpu 코어 개수를 확인해주면 좋다.
CPU 코어 수 확인
import multiprocessing as mp
num_cores = mp.cpu_count() # cpu 코어 수 반환
728x90