Python의 병렬 for 루프
-
multiprocessing
모듈을 사용하여 Python에서for
루프 병렬화 -
joblib
모듈을 사용하여 Python에서for
루프 병렬화 -
asyncio
모듈을 사용하여 Python에서for
루프 병렬화
루프를 병렬화한다는 것은 여러 코어를 사용하여 모든 프로세스를 병렬로 분산하는 것을 의미합니다. 많은 작업이있을 때 각 계산은 병렬 처리에서 이전 작업이 완료 될 때까지 기다리지 않습니다. 대신 완료를 위해 다른 프로세서를 사용합니다.
이 기사에서는 Python에서for
루프를 병렬화합니다.
multiprocessing
모듈을 사용하여 Python에서for
루프 병렬화
루프를 병렬화하기 위해 Python에서multiprocessing
패키지를 사용할 수 있습니다. 다른 진행중인 프로세스의 요청에 의해 자식 프로세스 생성을 지원하기 때문입니다.
for 루프 대신multiprocessing
모듈을 사용하여 iterable의 모든 요소에서 작업을 실행할 수 있습니다. Python에서 다중 스레드를 사용하면 Global Interpreter Lock으로 인해 더 나은 결과를 제공하지 못하므로multiprocessing.pool()
객체를 사용할 수 있습니다.
예를 들면
import multiprocessing
def sumall(value):
return sum(range(1, value + 1))
pool_obj = multiprocessing.Pool()
answer = pool_obj.map(sumall, range(0, 5))
print(answer)
출력:
0, 1, 3, 6, 10
joblib
모듈을 사용하여 Python에서for
루프 병렬화
joblib
모듈은 다중 처리를 사용하여 다중 CPU 코어를 실행하여for
루프의 병렬화를 수행합니다. 쉽고 간단한 병렬 계산을 위해 패턴을 기억하는 경량 파이프 라인을 제공합니다.
병렬 처리를 수행하려면 작업 수를 설정해야하며 작업 수는 CPU의 코어 수 또는 현재 사용 가능하거나 유휴 상태 인 코어 수로 제한됩니다.
delayed()
함수를 사용하면 잠시 후 특정 언급 된 메소드를 호출하도록 Python에 지시 할 수 있습니다.
Parallel()
함수는 지정된 코어 (이 경우 2)로 병렬 인스턴스를 생성합니다.
코드 실행을위한 목록을 만들어야합니다. 그런 다음 목록이 병렬로 전달되어 두 개의 스레드를 개발하고 작업 목록을 배포합니다.
아래 코드를 참조하십시오.
from joblib import Parallel, delayed
import math
def sqrt_func(i, j):
time.sleep(1)
return math.sqrt(i ** j)
Parallel(n_jobs=2)(delayed(sqrt_func)(i, j) for i in range(5) for j in range(2))
출력:
[1.0,
0.0,
1.0,
1.0,
1.0,
1.4142135623730951,
1.0,
1.7320508075688772,
1.0,
2.0]
asyncio
모듈을 사용하여 Python에서for
루프 병렬화
asyncio
모듈은 단일 스레드이며yield from
또는await
메소드를 사용하여 일시적으로 코 루틴을 일시 중단하여 이벤트 루프를 실행합니다.
아래 코드는 대기 할 주 함수에 영향을주지 않고 호출 될 때 병렬로 실행됩니다. 루프는 또한 주 기능과 병렬로 실행됩니다.
import asyncio
import time
def background(f):
def wrapped(*args, **kwargs):
return asyncio.get_event_loop().run_in_executor(None, f, *args, **kwargs)
return wrapped
@background
def your_function(argument):
time.sleep(2)
print("function finished for " + str(argument))
for i in range(10):
your_function(i)
print("loop finished")
출력:
ended execution for 4
ended execution for 8
ended execution for 0
ended execution for 3
ended execution for 6
ended execution for 2
ended execution for 5
ended execution for 7
ended execution for 9
ended execution for 1