0

파이썬에서 평균을 계산하는 두 가지 올바른 방법을 정의했습니다.파이썬에서 평균을 동시에 계산하는 방법은 무엇입니까?

첫 번째 기능은 평균을 계산하는 일반적인 방법이지만 루프를 실행할 때마다 이전 실행에 의존하지 않으므로 두 번째 코드를 작성했습니다. 따라서 이론적으로 평균은 병렬로 계산 될 수 있습니다.

그러나 "병렬"(병렬 실행하지 않음)은 일반 것보다 약 30 % 더 시간이 걸립니다.

내 가정이 정확하고 속도가 빠르다는 가치가 있습니까? 예라면 두 번째 함수를 두 번째 함수가 두 번째 함수를 parrallely로 실행하려면 어떻게해야합니까?

그렇지 않은 경우 어디서 잘못 되었나요?

+0

비동기는 무엇을 의미합니까? 파이썬에서 asyncio는 비동기 IO를 수행하지만 실제로 도움이되지는 않습니다. 계산 속도를 높이시겠습니까? 멍청한 표정으로 보아라.여러 코어에서 실행하려면 다중 처리가 필요합니다 (파이썬 스레드는 파이썬 코드를 동시에 실행할 수 없습니다). 두 번째 버전은 더 많은 작업을 할 때마다 (부서와 추가 할 때마다) 더 많은 시간을 필요로한다는 것이 놀랍습니다. – syntonym

+0

@syntonym 죄송합니다. 병렬로 실행하면 여러 개의 스레드에서 실행되는 것처럼 비동기 적이 아닙니다. 어떻게 다중 프로세스를 사용합니까? – ChrisIkeokwu

+0

Ofc 두 번째 것은 느립니다. 훨씬 더 많은 부서들! – sascha

답변

1

구현 한 코드는 기본적으로 과 (a1/n + a2/n + ... + an/n)의 차이입니다. 결과는 동일하지만 두 번째 버전에서는 더 많은 작업 (즉, (n-1) 개 더 많은 부서)이있어 계산 속도가 느려집니다. 두 번째 버전에서는 각 루프 실행이 다른 루프와 독립적이라고 주장했습니다. 첫 번째 루프에서 루프 실행을 완료하려면 다음 정보가 필요합니다. 실행 전에 total과 현재 value입니다. 두 번째 버전에서 루프 실행을 완료하려면 다음 정보가 필요합니다. mean 실행 전에 현재 valuenum_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는 충분히 빠르다.

+0

확실치 않지만, Numpy가 일반적으로 멀티 프로세싱을 사용하지 않는다는 것이 옳다고 생각합니다. 그러나 가능한 경우 벡터/SIMD 명령어를 사용하려고 시도하지만, 속도 향상이 발생하는 부분의 일부라고 생각합니다. – Jarak

+0

@Jarak numpy는 BLAS를 통해 연산을 수행하는 것처럼 보이므로 (최적화 된 버전을 사용할 때) 벡터, SIMD, 명령어 수준의 병렬 처리 등을 사용해야합니다. 또한 BLAS를 멀티 스레딩으로 컴파일 할 수 있지만 확실하지 않습니다 합계가 그것을 사용한다면. 일반적으로 파이썬은 상대적으로 느리다. 왜냐하면 많은 것들 (주로 파이썬 객체 생성)을 필요로하기 때문에 [numba] (http://numba.pydata.org/) 나 [cython] (http : // cython.org/)은 엄청난 속도 향상을 가져야합니다. – syntonym

관련 문제