2014-04-05 17 views
3

我正在計算每年相對計算密集型的一些數據。我已經使用numba(效果很好)來減少運行迭代計算數據所花費的時間。然而,鑑於我有20年的獨立數據,我想將它們分成5組,每組4個,可以運行4個不同的cpu核心。在Python中的多個CPU核心上運行簡單循環(工作在不同的數據上)的最簡單方法?

def compute_matrices(self): 
    for year in self.years: 
     self.xs[year].compute_matrix() 

在上面的代碼片段中,函數是包含屬性year和xs的Class中的一個方法。 year只是一個整數年份,而xs是一個橫截面對象,其中包含xs.data和compute_matrix()方法。

什麼是最簡單的方法來拆分多核心?

  1. 如果有一個Numba風格decorater,可以自動向上突破的循環和在不同的進程中運行它們,結果粘合在一起這將是巨大的。這是否存在?

  2. 使用Python.multiprocessing是我最好的選擇嗎?

回答

3

因此,有幾件事情你可以看看這個:

NumbaPro:https://store.continuum.io/cshop/accelerate/。這基本上是Numba的類固醇,爲多核架構和多核架構提供支持。不幸的是它並不便宜。

Numexpr:https://code.google.com/p/numexpr/。這是一個用於實現超線程的numpy數組的表達式求值器。

Numexpr-Numba(實驗性):https://github.com/gdementen/numexpr-numba。顧名思義,這是使用Numba後端的Numexpr。

很多答案將取決於您的compute_matrix方法中所做的操作。

最快(在開發時間方面)解決方案可能只是使用multiprocessing庫拆分計算。應該注意的是,如果您的compute_matrix函數沒有副作用,使用多處理將會更容易。

+0

的compute_matrix()有一堆的代碼,它不會與''@ autojit''工作,由於在數據幀的嚴重依賴對象等。然而,在各種步驟之下,我用@autojit修飾器將計算循環變成了單獨的例程,這非常適用。現在我想只是一年一年的並行工作。 – sanguineturtle

+0

要做到這一點,你需要改變一些東西。傳遞給「Process」實例的對象必須是可選的。看到這個問題的一些更多的信息:http://stackoverflow.com/questions/1816958/cant-pickle-type-in​​stancemethod-when-using-pythons-multiprocessing-pool-ma – ebarr

0

我遇到的複雜對象最簡單的方法是利用IPython並行計算引擎。

簡單地得到一個IPython的集羣中運行使用:ipcluster start -n 4或使用筆記本

然後你可以遍歷分配給不同的客戶XS對象。

def multicore_compute_matrices(self): 
    from IPython.parallel import Client 
    c = Client() 
    xs_list = [] 
    years = sorted(self.years) 
    # - Ordered List of xs Objects - # 
    for year in years 
     xs_list.append(self.xs[year]) 
    # - Compute across Clusters - # 
    results = c[:].map_sync(lambda x: x.compute_matrix(), xs_list) 
    # - Assign Results to Current Object - # 
    year = years[0] 
    for result in results: 
     self.xs[year].matrix = result 
     year += 1 

掛鐘時間%time結果:

%time A.compute_matrices() 
Wall Time: 5.53s 

%time A.multicore_compute_matrices(): 
Wall Time: 2.58s 
+0

這是一個2倍加速與4核心?您可能希望調查爲什麼代碼不能更有效地擴展。 – ebarr

+0

這是一個好點,我會進一步研究...這種方法可能會有相對較高的開銷。 – sanguineturtle