Beschleunige doppelte Schleife in Python

Gibt es eine Möglichkeit, eine Doppelschleife zu beschleunigen, die ihre Werte aus der vorherigen Iteration aktualisiert?

In Code:

def calc(N, m): x = 1.0 y = 2.0 container = np.zeros((N, 2)) for i in range(N): for j in range(m): x=np.random.gamma(3,1.0/(y*y+4)) y=np.random.normal(1.0/(x+1),1.0/sqrt(x+1)) container[i, 0] = x container[i, 1] = y return container calc(10, 5) 

Wie Sie sehen können, aktualisiert die innere Schleife die Variablen x und y, während die äußere Schleife mit einem anderen Wert von x jedes Mal beginnt. Ich glaube nicht, dass dies vektorisierbar ist, aber vielleicht gibt es noch andere Verbesserungen.

Vielen Dank!

2 Solutions collect form web for “Beschleunige doppelte Schleife in Python”

Ich glaube nicht, dass es zu einer wichtigen Beschleunigung hinzufügen wird, aber Sie können einige Funktionsaufrufe speichern, wenn Sie alle Ihre Gamma und normal verteilten zufälligen Werte auf einmal generieren.

Gamma-Funktionen haben eine Skalierungseigenschaft , so dass, wenn man einen Wert x aus einer Gamma (k, 1) Verteilung zeichnet, dann c*x ein Wert ist, der aus einer Gamma (k, c) Verteilung gezogen wird. Ähnlich können Sie mit der Normalverteilung einen y Wert aus einer normalen (0, 1) Verteilung aufnehmen und in einen Wert umwandeln, der aus einer normalen (m, s) Verteilung mit x*s + m . So können Sie Ihre Funktion wie folgt umschreiben:

 def calc(N, m): x = 1.0 y = 2.0 container = np.zeros((N, 2)) nm = N*m gamma_vals = np.random.gamma(3, 1, size=(nm,)) norm_vals = np.random.normal(0, 1, size=(nm,)) for i in xrange(N): for j in xrange(m): ij = i*j x = gamma_vals[ij] / (y*y+4) y = norm_vals[ij]/np.sqrt(x+1) + 1/(x+1) container[i, 0] = x container[i, 1] = y return container 

Wenn die tatsächlichen Parameter Ihrer Verteilungen einen einfacheren Ausdruck hatten, können Sie tatsächlich in der Lage sein, eine ausgearbeitete Form von np.cumprod oder dergleichen zu verwenden, und ersparen Sie sich die Schleifen. Ich bin nicht in der Lage, herauszufinden, einen Weg, dies zu tun …

Funktioniert das?

 for i in xrange(N): # xrange is an iterator, range makes a new list. # You save linear space and `malloc`ing time by doing this x += m*y # a simple algebra hack. Compute this line of the loop just once instead of `m` times y -= m*x y *= -1 # another simple algebra hack. Compute this line of the loop just once instead of `m` times container[i,0] = x container[i,1] = y return container 
  • Senden von StopIteration auf Schleife von außerhalb des Iterators
  • Ausbrechen von verschachtelten Schleifen [doppelte]
  • Looping durch ein Verzeichnis von Dateien in Python
  • Tkinter verwaltet meine Event-Loops neben meinem mainloop
  • Python finden das Minimum für Loops? [abgeschlossen]
  • Wie man in Python-Liste (Countdown)
  • Wie passe ich Vokale an?
  • Zuweisungsbedingung in Python while Loop
  • Brauchen Sie Hilfe, um eine Schleife hinzuzufügen, um Programm in Python neu zu starten
  • Python-Looping und Programm neu starten, wenn true
  • Spark Iteration Zeit zunehmend exponentiell bei der Verwendung beitreten
  • Python ist die beste Programmiersprache der Welt.