Das Zuweisen von Werten zu Array-Slices ist langsam

8

Ich versuche, einen Python-Algorithmus zu optimieren, indem ich ihn in Cython implementiere. Meine Frage bezieht sich auf einen bestimmten Leistungsengpass, der im folgenden Code vorhanden ist:

%Vor%

Ich habe den größten Engpass identifiziert, wenn ich einem Slice des res-Arrays eine Liste von Werten zuweise, wie mit

%Vor%

Allerdings, wenn ich die Zuordnung zu

ändere %Vor%

Dann läuft der Code um Größenordnungen schneller. Für mich ist das seltsam, denn der Cython-Compiler sollte schlau genug sein, das für mich zu tun. Oder muss ich es zuerst mit ein paar Tipps versehen? Ich sollte beachten, dass das Ändern des Slicing zu 0: 3 statt: und die Werteliste ein numpy Array macht die Leistung nicht verbessert.

Was ich gerne wissen möchte, ist, warum diese Operation die Leistung so stark beeinträchtigt und ob es einen Weg gibt, sie zu lösen, ohne auf die praktische Listen- und Slice-Notation verzichten zu müssen.

Mit freundlichen Grüßen

    
NielsGM 05.11.2012, 22:55
quelle

1 Antwort

3

Nein, Cython (getestet mit 0.17) ist nicht schlau genug, um diese Slice-Zuweisung zu optimieren. Wenn Sie sich den generierten C-Code anschauen (verwenden Sie cython -a und klicken Sie auf eine Zeile im HTML-Bericht, um den generierten Code zu sehen), dann können Sie das sehen

%Vor%

ist nach

kompiliert
  • Konvertierung zwischen C- und Python-Fließkommatypen
  • Zuweisung einer Liste [C,X,0]
  • Zuweisung eines Tupels (i, j, slice(None))
  • ein Aufruf von res.__setitem__
  • Fehler überprüft all diese
  • Freigabe der zugewiesenen Strukturen

Ie., fast alle die gleichen Dinge, die CPython tun würde, um diesen Code auszuführen.

Was Sie tun können, um dies zu umgehen, ist:

  1. Erklären Sie drei Variablen, sagen wir cdef double v1, v2, v3 ;
  2. weisen Sie diese den Bedingungen zu, wie v1, v2, v3 = C, X, 0 usw., die für drei C-Zuweisungen optimiert sind;
  3. Nach dem bedingten Block weisen Sie v1, v2, v3 auf res[i,j,0] usw. in drei separaten Zuweisungen zu.
Fred Foo 05.11.2012, 23:32
quelle

Tags und Links