2014-11-10 1 views
0

파이썬에서 그 결과를 평가하는 멀티 스레딩의 비교 우위를보기 위해 기본 함수를 프로파일 링하려고합니다. 함수가 적용되는 데이터의 크기가 증가함에 따라 스레드 버전이 점점 더 악화되는 것 같습니다. 여기에 고려하지 않은 시작 스레드에 오버 헤드가 있습니까? 누군가가 실제로 멀티 스레드 최적화를 달성하는 방법/내가 잘못하고있는 것을 설명 할 수 있습니까?단일 스레드보다 느리게 실행되는 멀티 스레드?

from multiprocessing import Pool 

def f(x): 
    return x*x 

pool = Pool(processes=4) 

import timeit 
print timeit.timeit('map(f, range(20000000))', setup = "from __main__ import f", number = 1) 
print timeit.timeit('pool.map(f, range(20000000))', setup = "from __main__ import f, pool", number = 1) 

결과 :

5.90005707741 
11.8840620518 
[Finished in 18.9s] 

해당하는 경우, 나는 숭고한 텍스트 3.

+0

을하지만 당신은 전혀 스레드를 사용하지 마십시오. 나는 다중 처리가 좋지 않다는 것을 말하지 않고있다. (일반적으로 좋다!)하지만 당신의 용어는 혼란 스럽다. –

+0

처리 할 수있는 CPU가 있습니까? 그렇지 않다면 일종의 시뮬레이트 된 멀티 스레딩이 발생합니다. 확신 할 수는 없지만 이것이 가능하다고 생각한다면 – user3282276

+0

멀티 프로세싱은 멀티 스레딩과 다르다는 것을 알고 계실 것입니다. 나는 이것이 (이 경우) 더 나쁜 것을 수행하는 이유는 당신의 프로세스가 많이하지 않는다는 것을 상상할 것이다. 그러나 그들과 통신하면서 프로세스를 설정하는 데 많은 오버 헤드가있다. –

답변

1

은 "작업 단위"에서 이것을 실행하면 각 작업에서 할 것은 너무 작습니다. 이것은 종종 맵핑 작업의 오버 헤드가 지배적 인 상황에서 작업을 "맵핑"할 때 종종 문제가됩니다. 물론 작업을 별도의 프로세스에 매핑하는 것은 동일한 프로세스에서 매핑하는 것보다 시간이 많이 걸리기 때문에 다중 프로세스 솔루션의 속도가 느려지는 것은 놀라운 일이 아닙니다.

더 많은 계산을 수행하는 함수로 시도해보십시오. 그러면 멀티 프로세싱의 이점을 알 수 있습니다.

0

@ 존은 이미 답을 주신하지만 예를 너무

from multiprocessing import Pool 

def f(n):#fibonacci 
    if n == 0: 
     return 0 
    elif n == 1: 
     return 1 
    else: 
     return f(n-1) + f(n-2) 

pool = Pool(processes=4) 

import timeit 

print timeit.timeit('map(f, xrange(35))', setup = "from __main__ import f", number = 1) 
print timeit.timeit('pool.map(f, xrange(35))', setup = "from __main__ import f, pool", number = 1) 

결과 제공하려면 : 당신은 멀티 스레딩에 대해 이야기

4.349 
2.497 
관련 문제