2017-03-23 72 views
0

所以這是我的代碼蟒蛇多比正常慢執行

def get_h(tmp):                 
    tmp =[map(float,line.split()[3:6]) for line in tmp[:768]] 
    return hbond(tmp,side) 

def get_sc(tmp): 
    return popvar(tmp) 

def calculate():         
    hframe=[] 
    pl=Pool() 
    s=time()          
    with open(file) as f: 
     for _ in xrange(100): 
      tmp=list(islice(f,9,9+atoms))   
      if not tmp: break 
      hframe.append(pl.apply_async(get_h,[tmp])) 
    hframe=[i.get() for i in hframe] 
    print time()-s #takes ~ 1 sec 

    s=time() 
    ll=[pl.apply_async(get_sc,[tmp]) for tmp in izip(*hframe)] 
    ll=[i.get() for i in ll] 
    print time()-s #takes ~23 sec !!! 

    s=time() 
    ll=[get_sc(tmp) for tmp in izip(*hframe)] 
    print time()-s #takes ~ 1 sec 

calculate是這裏的主要功能。它有2件事。 1st讀取分塊的文件,2nd調用另一個函數(由Fortran程序創建)進行進一步計算。我用Python多處理pool從文件讀取數據塊。但是當我使用pool作爲計算部分時,它比正常實施要慢得多(近23倍)。這裏發生了什麼,我該如何解決?

回答

0

工人和父進程不共享地址空間。

所以正在處理的數據通過進程間通信(隊列)從父節點發送給工作人員。 如果你有很多數據(你的情況768行),這會產生很多開銷。

這可能是一個更好的策略,可以給每個工人使用切片的邊界並讓工人自己從文件中讀取。這樣您就不需要將大量數據從父進程移動到工作人員。