2016-09-30 3 views
0

вот моя проблема:
Я хотел бы определить массив лиц и изменить записи этого массива в цикле for. Поскольку я также хотел бы видеть асимптотику полученного распределения, я хочу повторить эту симуляцию много, поэтому я использую матрицу для хранения нескольких массивов в каждой строке. Я знаю, как сделать это с помощью двух петель для:Python: редактировать строку матрицы параллельно

import random 
import numpy as np 

nobs = 100 
rep = 10**2 
steps = 10**2 
dmoney = 1 
state = np.matrix([[10] * nobs] * rep) 
for i in range(steps): 
    for j in range(rep) 
     sample = random.sample(range(state.shape[1]),2) 
     state[j,sample[0]] = state[j,sample[0]] + dmoney 
     state[j,sample[1]] = state[j,sample[1]] - dmoney 

Я думал, что я использую многопроцессорной библиотеку, но я не знаю, как это сделать, потому что в моем простом уме, рабочие манипулировать ту же глобальную матрицу в параллель, которую я читаю, не очень хорошая идея.
Итак, как я могу это сделать, чтобы ускорить вычисления?

Заранее спасибо.

+0

Я не понимаю вашу точку зрения, извините. Должен ли один поток всегда изменять только один столбец/строку или все данные? – Mijago

+0

Непонятно, что делает ваш цикл i, поскольку вы не ref i (предположительно, вы используете его в каком-то неподтвержденном коде, чтобы сделать с вашим симуляцией, calc calc.) Однако я думаю, что вы могли бы выполнить всю свою j-петлю в один numpy заявление. Но я действительно не думал, что через (np.random.choice выполняет аналогичную работу с python.random.sample) – paddyg

+0

Я хотел бы отредактировать матрицу по строкам до тех пор, пока вся матрица не будет изменена и повторите этот шаг несколько раз. То, что я не публиковал, было функцией для генерации выборки и шага усреднения. Первый аргумент против np.random.choice и последний аргумент для редактирования строки за строкой, пока вся матрица не изменилась. – Daniel

ответ

0

ОК, так что это может быть не очень полезно, я не профилировал его, чтобы увидеть, есть ли ускорение, но все же списки будут немного быстрее, чем обычные циклы.

... 
y_ix = np.arange(rep) # create once as same for each loop 
for i in range(steps): 
    # presumably the two locations in the population to swap need refreshing each loop 
    x_ix = np.array([np.random.choice(nobs, 2) for j in range(rep)]) 
    state[y_ix, x_ix[:,0]] += dmoney 
    state[y_ix, x_ix[:,1]] -= dmoney 

PS Что за количество разрядов на нескольких процессорах зависит от того, какие библиотеки были включены при компиляции (BLAS и т. Д.). Вы сможете найти информацию об этом.

EDIT Я могу подтвердить, после сравнения оригинала с индексированной версией numpy выше, что оригинальный метод выполняется быстрее!