2011-09-18 58 views
4

我有一大組簡單的模擬,我需要運行,我想知道它們是否可以同時完成。讓我描述一下這種情況:對於100種疾病,我有1000次吸毒流行,並且對於20種年齡組,這些疾病有1000次相應的殘疾權數(0-1級有多嚴重)。我需要做的模擬是,根據一系列流行率,確定有多少人會有不同的疾病組合。這裏是輸入數據看起來像10周的疾病是什麼:python中的同時模擬

from __future__ import division 
import numpy as np 
disease_number = np.array([1,2,3,4]*10) 
age = np.array([5, 10, 15, 20]*10) 
prevalence = np.random.uniform(0, 1, (40, 1000)) 
disability_weight = np.random.uniform(0,1,(40, 1000)) 

一個平局會是這個樣子,5歲的模擬,得出1

prev_draw1 = prevalence[age==5, 1] 
disability_draw1 = disability_weight[age==5, 1] 
simulation = np.random.binomial(1, prev_draw1, (100000, prev_draw1.shape[0]) 

然後計算鑑於多種疾病的合併症可歸因於每種疾病的殘疾體重,我做了以下工作:將分母設置爲當前殘疾體重的總和,並將特定疾病的殘疾體重作爲分子。對於疾病1:

denom = np.sum(disability_draw1**simulaiton) 
denom[denom==1]=0 
numerator = disability_draw1*simulation[:, 0] 
adjusted_dw = np.sum(numerator/denom) 

我需要爲每種疾病分別調整dw計算。有沒有辦法讓我同時進行這1000次模擬?任何幫助表示讚賞,我對python相當陌生,所以更多的描述是非常有用的。

回答

4

如果您有多個處理器/內核,您可以查看多處理模塊。

雖然在同一時間運行1000次模擬可能有點貴。您應該一次以每個核心一個的速率運行模擬。

您可以使用隊列模塊並使用進程池。

這裏是它可能看起來像這樣一個小樣本(未測試):

from multiprocessing import Process, Queue 

def run_simulation(simulations, results): 
    while simulations.qsize() > 0: 
     simulation_params = simulations.get() 
     # run simulation 
     results.put(simulation_result) 
     simulations.task_done() 

if __name__ == '__main__': 
    simulations_to_run = Queue() 
    simulations_to_run.put({}) # simulation parameters go in this dict, add all simulations, one per line (could be done in a loop, with a list of dicts) 
    results = Queue() 
    for i in range(8): #number processes you want to run 
     p = Process(target=run_simulation, args=(simulations_to_run, results)) 
     p.start() 

    simulations_to_run.join() 
    # now, all results shoud be in the results Queue 

http://docs.python.org/library/multiprocessing.html

+0

非常感謝此輸入。不幸的是,我需要爲20個地區,30個年齡段和2個性別進行同樣的1000次模擬 - 我將如何在集羣系統上並行化整個過程。 – mike

+0

如果您需要在羣集上運行此功能,則可以使用Beanstlkd之類的隊列服務器(如果在linux/unix上)。不要從simulations_to_run獲取作業,而是從隊列服務器中獲取它們。一旦任務運行,你可以把它放在beanstalkd服務器上的一個不同的管道上。這段代碼應該很容易適應使用隊列服務器。你將不得不在所有服務器上運行這個腳本。 – Martin