구현 한 코드는 기본적으로 과 (a1/n + a2/n + ... + an/n)
의 차이입니다. 결과는 동일하지만 두 번째 버전에서는 더 많은 작업 (즉, (n-1) 개 더 많은 부서)이있어 계산 속도가 느려집니다. 두 번째 버전에서는 각 루프 실행이 다른 루프와 독립적이라고 주장했습니다. 첫 번째 루프에서 루프 실행을 완료하려면 다음 정보가 필요합니다. 실행 전에 total
과 현재 value
입니다. 두 번째 버전에서 루프 실행을 완료하려면 다음 정보가 필요합니다. mean
실행 전에 현재 value
및 num_of_values
입니다. 두 번째 버전에서 볼 수 있듯이 우리는 더 많은 가치에 의존합니다!
하지만 어떻게 코어간에 작업을 나눌 수 있습니까 (멀티 프로세싱의 목표가 무엇입니까?). 하나의 코어에 값의 첫 번째 절반을주고 두 번째 코어에 두 번째 절반 즉, ((a1+a2+ ... + a(n//2)) + (a(n//2 +1) + ... + a(n))/n)
을 부여 할 수 있습니다. 예, n으로 나누는 작업은 코어간에 분할되지 않지만 단일 명령이므로 우리는 실제로 신경 쓰지 않습니다. 또한 분할 할 수없는 왼쪽 합계와 오른쪽 합계를 추가해야하지만 다시 한 번 작업 만 수행하면됩니다.
그래서 코드는 우리가 실행하려는 :
는
def my_sum(values):
total = 0
for value in values:
total += value
return total
여전히 파이썬에 문제가있다 - 보통 사람은 계산을 수행하는 스레드를 사용할 수, 각 스레드가 하나 개의 코어를 사용하기 때문이다. 그러나이 경우에는 프로그램이 경쟁 조건에 부합하지 않도록주의해야하며 파이썬 해석기 자체도이를 처리해야합니다. CPython은 가치가 없으므로 기본적으로 한 번에 하나의 스레드에서만 실행됩니다. 기본 솔루션은 다중 처리를 통해 여러 프로세스를 사용하는 것입니다.
from multiprocessing import Pool
if __name__ == '__main__':
with Pool(5) as p:
results = p.map(my_sum, [long_list[0:len(long_list)//2], long_list[len(long_list)//2:]))
print(sum(results)/len(long_list)) # add subresults and divide by n
물론 여러 프로세스가 무료로 제공되지는 않습니다. 포크 (fork), 복사물 등을 필요로하므로 예상대로 2의 스피드 업을 얻을 수 없습니다. 또한 가장 큰 속도 저하는 실제로 파이썬 자체를 사용하고 있으며, 빠른 수치 계산을 위해 실제로 최적화되지 않았습니다. 그 주위에는 여러 가지 방법이 있지만, 아마도 numpy을 사용하는 것이 가장 간단 할 것입니다. 그냥 다음을 사용하십시오 :
import numpy
print(numpy.mean(long_list))
아마도 파이썬 버전보다 훨씬 빠릅니다. 나는 numpy가 다중 처리 내부를 사용한다고 생각하지 않는다. 그래서 다중 프로세스와 빠른 구현 (numpy 나 다른 C 언어로 작성된 다른 것들)을 사용하여 향상시킬 수 있지만 보통 numpy는 충분히 빠르다.
비동기는 무엇을 의미합니까? 파이썬에서 asyncio는 비동기 IO를 수행하지만 실제로 도움이되지는 않습니다. 계산 속도를 높이시겠습니까? 멍청한 표정으로 보아라.여러 코어에서 실행하려면 다중 처리가 필요합니다 (파이썬 스레드는 파이썬 코드를 동시에 실행할 수 없습니다). 두 번째 버전은 더 많은 작업을 할 때마다 (부서와 추가 할 때마다) 더 많은 시간을 필요로한다는 것이 놀랍습니다. – syntonym
@syntonym 죄송합니다. 병렬로 실행하면 여러 개의 스레드에서 실행되는 것처럼 비동기 적이 아닙니다. 어떻게 다중 프로세스를 사용합니까? – ChrisIkeokwu
Ofc 두 번째 것은 느립니다. 훨씬 더 많은 부서들! – sascha