2017-09-23 8 views
0

오늘 코드를 실행하고 멀티 코어 CPU에서 실행하려고 했으므로 어디에도 맵을 작성하여 pool.map으로 변경했습니다. 놀랍게도 내 코드가 처리 능력이나 메모리를 많이 사용하더라도 느리게 실행되었습니다. 그래서이 테스트를 작성했고, pathos 및 다중 처리를 사용합니다. 파이썬 다중 처리, 천천히 천천히

from pathos.pools import ProcessPool 
from pathos.pools import ThreadPool 
#from pathos.pools import ParallelPool 
from pathos.pools import SerialPool 
from multiprocessing import Pool 

import time 

def timeit(method): 
    def timed(*args, **kw): 
     ts = time.time() 
     result = method(*args, **kw) 
     te = time.time() 
     print ('%r (%r, %r) %2.2f sec' % \ 
       (method.__name__, args, kw, te-ts)) 
     return result 

    return timed 

def times2(x): 
    return 2*x 

@timeit 
def test(max,p): 
    (p.map(times2, range(max))) 

def main(): 
    ppool = ProcessPool(4) 
    tpool = ThreadPool(4) 
    #parapool = ParallelPool(4) 
    spool = SerialPool(4) 
    pool = Pool(4) 
    for i in range(8): 
     max = 10**i 
     print(max) 
     print('ThreadPool') 
     test(max,tpool) 
     #print('ParallelPool') 
     #test(max,parapool) 
     print('SerialPool') 
     test(max,spool) 
     print('Pool') 
     test(max,pool) 
     print('ProcessPool') 
     test(max,ppool) 
     print('===============') 


if __name__ == '__main__': 
    main() 

자주 ProcessPool 뛰는 및 SerialPool보다 더 느린 결과

1 
ThreadPool 
'test' ((1, <pool ThreadPool(nthreads=4)>), {}) 0.00 sec 
SerialPool 
'test' ((1, <pool SerialPool()>), {}) 0.00 sec 
Pool 
'test' ((1, <multiprocessing.pool.Pool object at 0x0000011E63D276A0>), {}) 0.17 sec 
ProcessPool 
'test' ((1, <pool ProcessPool(ncpus=4)>), {}) 0.00 sec 
=============== 
10 
ThreadPool 
'test' ((10, <pool ThreadPool(nthreads=4)>), {}) 0.00 sec 
SerialPool 
'test' ((10, <pool SerialPool()>), {}) 0.00 sec 
Pool 
'test' ((10, <multiprocessing.pool.Pool object at 0x0000011E63D276A0>), {}) 0.00 sec 
ProcessPool 
'test' ((10, <pool ProcessPool(ncpus=4)>), {}) 0.01 sec 
=============== 
100 
ThreadPool 
'test' ((100, <pool ThreadPool(nthreads=4)>), {}) 0.00 sec 
SerialPool 
'test' ((100, <pool SerialPool()>), {}) 0.00 sec 
Pool 
'test' ((100, <multiprocessing.pool.Pool object at 0x0000011E63D276A0>), {}) 0.00 sec 
ProcessPool 
'test' ((100, <pool ProcessPool(ncpus=4)>), {}) 0.01 sec 
=============== 
1000 
ThreadPool 
'test' ((1000, <pool ThreadPool(nthreads=4)>), {}) 0.00 sec 
SerialPool 
'test' ((1000, <pool SerialPool()>), {}) 0.00 sec 
Pool 
'test' ((1000, <multiprocessing.pool.Pool object at 0x0000011E63D276A0>), {}) 0.00 sec 
ProcessPool 
'test' ((1000, <pool ProcessPool(ncpus=4)>), {}) 0.02 sec 
=============== 
10000 
ThreadPool 
'test' ((10000, <pool ThreadPool(nthreads=4)>), {}) 0.00 sec 
SerialPool 
'test' ((10000, <pool SerialPool()>), {}) 0.00 sec 
Pool 
'test' ((10000, <multiprocessing.pool.Pool object at 0x0000011E63D276A0>), {}) 0.00 sec 
ProcessPool 
'test' ((10000, <pool ProcessPool(ncpus=4)>), {}) 0.09 sec 
=============== 
100000 
ThreadPool 
'test' ((100000, <pool ThreadPool(nthreads=4)>), {}) 0.04 sec 
SerialPool 
'test' ((100000, <pool SerialPool()>), {}) 0.00 sec 
Pool 
'test' ((100000, <multiprocessing.pool.Pool object at 0x0000011E63D276A0>), {}) 0.01 sec 
ProcessPool 
'test' ((100000, <pool ProcessPool(ncpus=4)>), {}) 0.74 sec 
=============== 
1000000 
ThreadPool 
'test' ((1000000, <pool ThreadPool(nthreads=4)>), {}) 0.42 sec 
SerialPool 
'test' ((1000000, <pool SerialPool()>), {}) 0.00 sec 
Pool 
'test' ((1000000, <multiprocessing.pool.Pool object at 0x0000011E63D276A0>), {}) 0.17 sec 
ProcessPool 
'test' ((1000000, <pool ProcessPool(ncpus=4)>), {}) 7.54 sec 
=============== 
10000000 
ThreadPool 
'test' ((10000000, <pool ThreadPool(nthreads=4)>), {}) 4.57 sec 
SerialPool 
'test' ((10000000, <pool SerialPool()>), {}) 0.00 sec 
Pool 
'test' ((10000000, <multiprocessing.pool.Pool object at 0x0000011E63D276A0>), {}) 2.25 sec 
ProcessPool 
'test' ((10000000, <pool ProcessPool(ncpus=4)>), {}) 81.51 sec 
=============== 

당신은 멀티 프로세싱 볼 수 있습니다. 내가 i5-2500을 실행하고 나는 핍

>pip freeze 
colorama==0.3.9 
decorator==4.1.2 
dill==0.2.7.1 
helper-htmlparse==0.1 
htmldom==2.0 
lxml==4.0.0 
multiprocess==0.70.5 
pathos==0.2.1 
pox==0.2.3 
ppft==1.6.4.7.1 
py==1.4.34 
pyfs==0.0.8 
pyreadline==2.1 
pytest==3.2.2 
six==1.11.0 

를 통해 오늘 비애를 설치 왜 이런 일이 발생 하는가?

+0

내가 한 가지 확실한 것은 쓰레드가 많을수록 파이썬 코드에 더 많은 시간이 걸린다는 것입니다. 최신 파이썬은 GIL의 더 나은 버전을 가지고 있습니다. 그래서 최신 Python 3.x 버전에서 이전 버전과 비교하여 성능이 향상 될 수도 있습니다. –

+0

또한 파이썬은 실제로 여러 스레드를 사용하지 않습니다. 단일 스레드를 사용하고 잠금은 프로세스간에 상호 교환됩니다. –

답변

0

까다로운 작업의 병렬 처리를 통해서만 이점을 얻을 수 있습니다. 멀티 프로세싱/멀티 스레딩 코드에 필요한 통신과 비교하여 작업이 매우 즉각적입니다. 마지막 1 초 함수를 사용하면 효과를 볼 수 있습니다. 또한 GIL 때문에 파이썬에서는 IO가 제한되어 있다면 멀티 스레딩을 통해서만 이익을 얻을 수 있다는 것을 기억하십시오. CPU에 한정된 작업은 다중 처리와 함께 진행됩니다.

Raymond에서이 대화를 참조하십시오.