2015-07-01 40 views
1

我有大約4000個數據點,我有一個處理它們的程序。由於數量巨大,程序非常慢,儘管我在嵌套循環中使用了numpy.arange進行一些向量化。Python中多處理多參數方法

我搜索了pool.map,問題是它只有一個參數。我看到這裏存在一些對此問題的解答,Python multiprocessing pool.map for multiple arguments。我使用了最後一個使用map方法的參數列表,我有大約4個參數,我把它們放在一個列表中,並在map方法中傳入一個長的函數名。在函數中,我從列表中提取每個參數並執行操作,但它不起作用。這就是我所說的地圖代碼,

if __name__ == '__main__': 
    pool= Pool(processes=8) 
    p= pool.map (kriging1D, [x,v,a,n]) 
    plt.scatter(x,v,color='red') 
    plt.plot(range(5227),p,color='blue') 

這是要並行化功能,

def kriging1D(args): 
    x=args[0] 
    v=args [1] 
    a= args [2] 
    n= args [3] 
#perform some operations on the args.. 
... 
#return the result.. 

但是,我得到這個錯誤,

plt.plot(range(5227),p,color='blue') 
NameError: name 'p' is not defined 

注:添加此之前,線,

if __name__ == '__main__': 

我懂了錯誤,

RuntimeError: 


Attempt to start a new process before the current process 
     has finished its bootstrapping phase. 

     This probably means that you are on Windows and you have 
     forgotten to use the proper idiom in the main module: 

      if __name__ == '__main__': 
       freeze_support() 
       ... 

     The "freeze_support()" line can be omitted if the program 
     is not going to be frozen to produce a Windows executable. 

這就是爲什麼我添加的if語句。

欲瞭解更多清晰度:v和x是每個4000的大尺寸(均具有相同長度)的向量。我的意圖是並行化每個v [i]和x [i]的處理,例如一次處理多個v和x元素,而不是逐個處理元素。

任何人都可以告訴我我在做什麼錯誤嗎?或者,建議一種替代方法?

謝謝。

+0

[Python多處理pool.map多個參數]的可能重複(http://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-arguments) –

+0

謝謝,我會檢查。 – Dania

回答

1

map()的操作和因此我認爲pool.map()(我自己沒有用過)的操作如下。

調用map(myfunc, [1, 2, 3])依次調用myfunc對每個參數1, 2, 3myfunc(1),然後myfunc(2)

所以pool.map(kriging1D, [x,v,a,n])相當於調用kriging1D(x),然後kriging1D(v),等等,不是嗎?從你的方法體,它看起來像是而不是你想要做什麼。你確定你真的想要使用pool.map而不是pool.apply嗎?

我很抱歉,如果我誤解了你的問題;這不是我的專業領域,但我想我會嘗試和幫助,因爲還沒有答案。

+0

非常感謝,我對python中的多重處理很感興趣。根據你對地圖的解釋,正如你所說,這不是我想要做的。正如我在問題中所說的那樣,我想要平行處理矢量的索引。但是,我真的不知道該怎麼做。我讀過那個pool.apply不再使用,你能告訴我用什麼技術來實現我的目標嗎?謝謝。 – Dania

+0

@Dania我覺得我不能幫忙;我對多處理或你正在嘗試做什麼沒有很好的理解。 – Sam

1

您使用的語法適用於** apply *,這是一個單一的調用,而不是批量並行。

>>> from pathos.multiprocessing import ProcessPool as Pool 
>>> p = Pool() 
>>> 
>>> def do_it(x,y,z): 
... return x+y*z 
... 
>>> p.apply(do_it, [2,3,4]) 
14 

如果你想使用批量並行,你需要給每個參數相同長度的列表。在這裏,我正在5路並行中運行3參數函數 - 請注意長度爲5的列表。

>>> p.map(do_it, range(5),range(5,10),range(0,10,2)) 
[0, 13, 30, 51, 76] 

如果你想使用這個語法,你需要的multiprocessing叉叫pathos(或者還有parmap) - 二者也於問題的SO回答你的鏈接找到。

如果您想使用stdlib multiprocessing,那麼您應該查看同一問題中的其他答案。

但是,希望以上內容能夠澄清這些答案。

+0

謝謝你的回答。 – Dania