[問題] python multiProcess效能很差?

作者: ntuleo (里歐)   2015-04-28 11:02:45
主要是參考segmentfault的這篇
http://segmentfault.com/a/1190000000414339
看起來很有效,可是實際...
if __name__ == "__name__":
pool = Pool()
content = pool.map(transferConcat, [(obj_grab, content)])[0]
pool.close()
pool.join()
def concatMessage(obj_grab, content):
for logCatcher in obj_grab:
for key in logCatcher.dic_map:
regex = re.compile(key)
for j in range(len(content)):
for m in re.finditer(regex, content[j]):
content[j] += " " + logCatcher.index + " " + logCatcher.dic_map[key]
return content
def transferConcat(args):
return concatMessage(*args)
以上是我的代碼(部分,只貼問題點),執行時間22秒
若單純執行method大概也是22秒...等於沒加速...
我試過調整pool的數量,沒什麼效果
請問要怎麼做才能真正體現mulitiProcess的效能呢?
作者: ccwang002 (亮)   2015-04-28 12:56:00
你實際上丟給 Pool.map(func, listarg1, listarg2)listargx = [x1, x2, ...] Pool 會並行執行 x1 和 x2但你只給了一組 input 所以實際上就是沒加速等於 pool.map(concatMessage, [obj_grab], [content])
作者: ntuleo (里歐)   2015-04-28 20:22:00
所以一組就不行嗎? 那有其它方式可以加速for loop嗎?
作者: CaptainH (Cannon)   2015-04-28 20:28:00
對平行化完全沒有概念的話, 還是不要用比較好
作者: ccwang002 (亮)   2015-04-28 21:41:00
pool.map(cM, [obj1, obj2, ...], [c1, c2, ...])這樣就會有平行的效果,multiprocess 的對象是很明確的可以加速 for loop,就要針對 for loop 裡面的邏輯設計
作者: LiloHuang (十年一刻)   2015-04-28 22:39:00
Python Concurrency From the Ground Up - PyCon 2015看看 David Beazley 大師的影片 http://goo.gl/oCuZaJ基本上 Python 的 multiprocessing 是以 tasks 為單位你必須要自己先把工作轉化成一堆 task 再來進行平行畢竟這不像 OpenMP 加個 #pragma omp parallel 就會動就像 ccwang002 提到的,你的 task 目前只有一個...你可以嘗試著把第一層迴圈展開,換成用 map 的寫法就好處理的 func 裡面不要去存取共享變數,讓每個 process都能夠獨立的跑完它的結果,之後再把結果進行 reduce

Links booklink

Contact Us: admin [ a t ] ucptt.com