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
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
ist nach
kompiliert[C,X,0]
(i, j, slice(None))
res.__setitem__
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:
cdef double v1, v2, v3
; v1, v2, v3 = C, X, 0
usw., die für drei C-Zuweisungen optimiert sind; v1, v2, v3
auf res[i,j,0]
usw. in drei separaten Zuweisungen zu. Tags und Links python performance numpy cython