2016-09-30 4 views
0

Hier ist mein Problem:
Ich möchte ein Array von Personen definieren und die Einträge dieses Arrays in einer for-Schleife ändern. Da ich auch gerne die Asymptotik der resultierenden Verteilung sehen möchte, möchte ich diese Simulation sehr oft wiederholen, daher verwende ich eine Matrix, um die verschiedenen Arrays in jeder Zeile zu speichern. Ich weiß, wie dies für Schleifen mit zwei zu tun:Python: Matrixzeile parallel bearbeiten

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 

Ich dachte, ich die Multiprozeß-Bibliothek benutzen, aber ich weiß nicht, wie es zu tun, weil in meinem einfachen Verstand, die Arbeiter die gleiche globale Matrix manipulieren parallel, was ich gelesen habe, ist keine gute Idee.
Also, wie kann ich das tun, um Berechnungen zu beschleunigen?

Vielen Dank im Voraus.

+0

Ich verstehe nicht genau, sorry. Sollte ein Thread immer nur eine Spalte/Zeile oder alle Daten verändern? – Mijago

+0

Es ist nicht klar, was Ihre i-Schleife tut, da Sie nicht i ref (wahrscheinlich verwenden Sie es in einem nicht gezeigten Code mit Ihrer Simulation, Verteilungsberechnungen). Allerdings denke ich, dass Sie alle Ihre j-Schleife in einem einzigen tun können Statement .. Aber ich habe nicht wirklich gedacht, dass durch (np.random.choice macht einen ähnlichen Job wie python.random.sample) – paddyg

+0

Ich möchte die Matrix Zeile für Zeile bearbeiten, bis die gesamte Matrix geändert wird und diesen Schritt wiederholen mehrmals. Was ich nicht gepostet habe, war die Funktion für die Probengenerierung und einen Mittelungsschritt. Erstere ist ein Argument gegen die np.random.choice und letzteres ein Argument für die Bearbeitung von Zeile für Zeile, bis sich die gesamte Matrix geändert hat. – Daniel

Antwort

0

OK, also könnte dies nicht viel nützen, ich habe es nicht profiliert, um zu sehen, ob es eine Beschleunigung gibt, aber die Listenkompressentierung wird sowieso etwas schneller sein als normale Schleifen.

... 
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 Welche numply Splits über mehrere Prozessoren hinweg hängt davon ab, welche Bibliotheken beim Kompilieren enthalten sind (BLAS usw.). Sie können Informationen darüber online finden.

EDIT Ich kann bestätigen, nach dem Vergleich der ursprünglichen mit der numpy indizierten Version oben, dass die ursprüngliche Methode schneller ist!