2012年2月20日 星期一

[python]multiprocessing pool map

最近在微調程式的效能,第一個我想到的,就是從多執行緒來下手。

google 說得好,如果程式裡有用到 map,那麼就可以從 map 開始改。

python 有提供 multiprocessing pool 就不用自己寫 pool。

不過,有幾點要注意:

  1. 這個是 process pool,所以比較吃資源。
  2. 在執行的時候,由於你寫的 py 會被當成 module 讀進執行。
    所以,一定要判斷自身是否為 __main__。也就是要:

if __name__ == '__main__':
    # do something

若第 2 點沒注意到,就會不斷地重覆遞迴執行到當掉。

給個失敗的例子:

import multiprocessing
def m1(x):
  return x*x
pool = multiprocessing.Pool(processes=3)
pool.map(m1,[‘1’,'2’,'3’,'4’])

給個成功的例子:

import multiprocessing
def m1(x):
  return x*x
if __name__ == '__main__':
  pool = multiprocessing.Pool(processes=3)
  pool.map(m1,[‘1’,'2’,'3’,'4’])

如果本來程式就有按 map / reduce 的方式寫,那換成 multiprocess pool 是很快樂的一件事。
試試吧。

沒有留言:

張貼留言