vorbelegen und füllen. Dies reduzierte meine Laufzeit von etwa 1000 Sekunden auf 20 Sekunden.
data_stack = numpy.empty((321, 720, 1000), dtype=numpy.float32)
for index in range(len(data)):
data_stack[0:321,0:720,index] = data[index]
Ich machte etwas ähnliches. dstack ist keine gute Lösung für dieses Problem. Ein Kollege erinnerte mich an das dynamische Array-Problem und die amortisierte Analyse. http://anh.cs.luc.edu/363/notes/06A_Amortizing.html
Wenn Sie ein dynamisches Array erweitern möchten, müssen Sie ein neues Array zuweisen, das die ursprünglichen Daten und die neuen Daten enthalten kann. Sie kopieren dann das alte Array in das neue Array und die neuen Daten in das neue Array. Das ist eine teure Operation.
Angenommen, Sie haben ein Array der Größe 10 und möchten 2 Elemente gleichzeitig hinzufügen. Um das erste Element hinzuzufügen, müssen Sie das Array auf Größe 11 erweitern und 11 Elemente kopieren (Original 10 + 1 neues Element). Um das zweite Element hinzuzufügen, müssen Sie das Array auf 12 erweitern und 12 Elemente kopieren. Wenn Sie im Voraus wissen, dass Sie 2 Elemente hinzufügen, könnten Sie die Größe des Arrays auf 12 geändert haben und nur 12 Elemente anstelle von insgesamt 23 kopieren. Es stellt sich heraus, dass die Größe des Arrays jedes Mal verdoppelt wird, wenn Sie ausgehen der Raum ist eine viel effizientere Lösung.
Wie das hier gilt: dstack verdoppelt die Größe des ndarray nicht, es soll nur so viel Speicher wie nötig zugewiesen werden. Jedes Mal, wenn Sie dstack aufrufen, kopieren Sie also alle Daten, die Sie in Ihrem ndarray haben, in ein neues ndarray mit Platz für die neuen Daten. Beachten Sie, dass die Zeit für das Stoppen mit jedem Aufruf zunimmt.
Können Sie uns irgendeinen Code zeigen? – arshajii
Warum dstack sie? Warum nicht einfach die Statistiken für jede Schleife berechnen? – mgilson
@mgilson: for-Schleifen in Python sind langsam, wenn er das Achsenschlüsselwort verwendet, kann er die for-Schleifen hinunter zu numpy (C) drücken, die viel schneller ist – usethedeathstar