python & numpy: Summe eines Array-Slices

9

Ich habe 1-dimensionales numpy Array ( array_ ) und eine Python-Liste (list _).

Der folgende Code funktioniert, ist aber ineffizient, weil Slices eine unnötige Kopie enthalten (sicherlich für Python-Listen, und ich glaube auch für numpige Arrays?):

%Vor%

Was ist eine gute Möglichkeit, das umzuschreiben?

    
max 05.05.2011, 00:53
quelle

4 Antworten

13

Wenn Sie ein numpliges Array abschneiden erstellt keine Kopie, wie dies bei einer Liste der Fall ist.

Als einfaches Beispiel:

%Vor%

Dies ergibt:

%Vor%

Obwohl wir die Werte in y geändert haben, ist es nur eine Ansicht in den gleichen Speicher wie x .

Das Schneiden eines ND-Arrays gibt eine Ansicht zurück und dupliziert den Speicher nicht.

Es wäre jedoch viel effizienter, array_[1:].sum() zu verwenden, als Pythons eingebaute sum in einem numply-Array aufzurufen.

Zum schnellen Vergleich:

%Vor%

Bearbeiten:

Im Falle der Liste, wenn Sie aus irgendeinem Grund keine Kopie erstellen möchten, könnten Sie immer itertools.islice verwenden. Statt:

%Vor%

Sie könnten tun:

%Vor%

In den meisten Fällen ist das jedoch Overkill. Wenn Sie lange genug mit Listen arbeiten, dass die Speicherverwaltung ein großes Problem darstellt, sollten Sie wahrscheinlich keine Liste zum Speichern Ihrer Werte verwenden. (Listen sind nicht dazu bestimmt oder vorgesehen, Objekte kompakt im Speicher zu speichern.)

Außerdem möchten Sie dies nicht für ein Array mit Zahlen machen. Das Ausführen von some_array[1:].sum() wird mehrere Größenordnungen schneller sein und kein mehr Speicher als islice verwenden.

    
Joe Kington 05.05.2011, 00:57
quelle
7

Mein erster Instinkt war der gleiche wie bei Joe Kington, wenn es um Listen geht, aber ich habe überprüft, und auf meiner Maschine ist islice durchweg langsamer!

%Vor%

Ich probierte ein custom_sum und fand, dass es schneller war, aber nicht viel:

%Vor%

Außerdem war es bei größeren Zahlen weitaus langsamer!

%Vor%

Ich konnte mir nichts anderes vorstellen, um es zu testen. (Gedanken, irgendjemand?)

    
senderle 05.05.2011 01:46
quelle
3

@Joe Kington (dies ist eine vorläufige Antwort, um nur meine Zeit zu zeigen, ich werde sie bald entfernen):

%Vor%

Soweit meine numplige (1.5.1) Quelle sagt, ist sum(.) nur ein Wrapper für x.sum(.) . Daher ist die Ausführungszeit bei größeren Eingaben (asymptotisch) für sum(.) und x.sum(.) gleich.

Bearbeiten : Diese Antwort sollte nur eine temporäre sein, aber tatsächlich kann sie (und ihre Kommentare) tatsächlich für jemanden nützlich sein. Also werde ich es einfach so lassen, wie es gerade ist, bis jemand mich wirklich darum bittet, es zu löschen.

    
eat 05.05.2011 15:55
quelle
0

Ich finde x[1:].sum() nicht signifikant langsamer als x.sum() . Für Listen sum(x) - x[0] ist schneller als sum(x[1:]) (ca. 40% schneller OMM).

    
jtniehof 05.05.2011 14:16
quelle

Tags und Links