Cython Memoryview als Rückgabewert

8

Betrachten Sie diesen Dummy-Cython-Code:

%Vor%

Wenn ich jetzt ein Cython -a tue, werden die Rückgabeanweisungen in gelb angezeigt. Ich mache etwas Ähnliches in einem sehr performancekritischen Programm, und laut Profiling verlangsamt das wirklich meinen Code. Also, warum benötigt Cython Python für diese Return-Anweisungen? Die kommentierte Datei gibt einen Hinweis:

%Vor%

Erstaunlicherweise ist eine Google-Suche nach Cython "Memoryview Rückgabewert ist nicht initialisiert" gibt Null Ergebnisse.

    
HenriV 07.01.2014, 14:20
quelle

1 Antwort

3

Der langsame Teil ist nicht das, was du denkst. Der langsame Teil ist (nun ... in erster Linie)

%Vor%

Nicht die f(data) . Das data = .

Dies weist eine struct zu, die als so definiert ist

%Vor%

und die erwähnte Aufgabe tut

%Vor%

wobei __pyx_t_3 von diesem Typ ist. Wenn dies in einer Schleife so stark ausgeführt wird, wie es ist, dauert es viel länger, die Strukturen zu kopieren, als den trivialen Körper der Funktion zu machen. Ich habe ein Timing in reinem C gemacht und es gibt ähnliche Zahlen.

( Notiz bearbeiten : Das Zuweisen ist eigentlich in erster Linie ein Problem, weil es auch dazu führt, dass Generierung von Strukturen und anderen Kopien nicht optimiert wird.)

Aber scheint das Ganze albern zu sein. Der einzige Grund, die Struktur zu kopieren, ist, ob sich etwas geändert hat, aber nichts hat. Der Speicherpunkt befindet sich an der gleichen Stelle, die Datenpunkte an der gleichen Stelle und die Form, die Schritte und die Offsets sind gleich.

Die einzige Möglichkeit, die struct -Kopie zu vermeiden, ist, nichts von dem zu ändern, auf das sie verweist (aka. gib immer das memoryview in) zurück. Das ist nur möglich in Situationen, in denen die Rückkehr sowieso sinnlos ist, wie hier. Oder du kannst am C hacken, denke ich, wie ich war. Weine nur nicht, wenn du etwas kaputt machst.

Beachte auch, dass du deine Funktion nogil erstellen kannst, damit sie nichts mit Python zu tun haben kann.

BEARBEITEN

Cs optimierender Compiler warf mich etwas ab. Im Grunde habe ich einige Zuweisungen entfernt und viele andere Dinge entfernt. Grundsätzlich ist der langsame Pfad der folgende:

%Vor%

(Kompilieren ohne Optimierungen). Ich bin kein C-Programmierer, also entschuldige ich mich, wenn das, was ich getan habe, auf irgendeine Art und Weise stinkt, die nicht direkt mit der Tatsache verbunden ist, dass ich computergenerierten Code kopiert habe.

Ich weiß, das hilft nicht , aber ich habe mein Bestes gegeben, OK?

    
Veedrac 10.01.2014 15:41
quelle

Tags und Links