2016-09-30 6 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 

が、私の簡単な心の中で、労働者が同じグローバル行列を操作するので、私は、どのように行うのか分からない。私は、forループ2でこれを行う方法を知っています私が読むのは良い考えではありません。
計算を高速化するにはどうすればよいですか?

ありがとうございます。

+0

私はあなたの点を正確には知りません、申し訳ありません。 1つのスレッドは常に1つの列/行またはすべてのデータを変更する必要がありますか? – Mijago

+0

あなたの私のループが何をしているのかはわかりません(おそらく、あなたのシミュレーションでは、図示していないコードでそれを使用しています)。しかし、私はあなたのすべてのループを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複数のプロセッサでnumpyがどのように分割されるかは、コンパイル時にどのライブラリが含まれているか(BLASなど)によって異なります。これについての情報を見つけることができます。

EDIT上記のnumpyのインデックス付きバージョンとオリジナルを比較した後、元のメソッドが高速であることを確認できます。

関連する問題