我需要运行一大堆简单的模拟,我想知道它们是否可以同时完成。让我来描述一下这种情况:对于20个年龄组,我有大约100种疾病的流行率和1000种相应的残疾权重(这些疾病在0-1级别有多差)。我需要做的模拟是,在给定一组流行率的情况下,确定有多少人会有不同的疾病组合。以下是10种疾病的输入数据:
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很新,所以更多的描述非常有用。
答案 0 :(得分: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