Одновременные симуляции в питоне - PullRequest
4 голосов
/ 18 сентября 2011

У меня есть большой набор простых симуляций, которые мне нужно запустить, и мне интересно, могут ли они быть выполнены одновременно.Позвольте мне описать ситуацию: у меня есть 1000 тиражей распространенности для ~ 100 болезней и 1000 тиражей соответствующих весов инвалидности для этих болезней (насколько плохо иметь это заболевание по шкале 0-1) для 20 возрастных групп.Имитация, которую мне нужно сделать, состоит в том, чтобы определить, учитывая набор распространенности, сколько людей будет иметь различные комбинации заболеваний.Вот как будут выглядеть исходные данные для 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, поэтому больше описаний очень полезно.

1 Ответ

4 голосов
/ 18 сентября 2011

Если у вас несколько процессоров / ядер, вы можете взглянуть на многопроцессорный модуль.

Выполнение 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...