So deklarieren Sie die 2D-Liste in Cython

8

Ich versuche, diese Art von Code zu kompilieren:

%Vor%

was anhebt:

%Vor%

Ich nehme an, dass ich die Variable nicht an der angegebenen Stelle verwenden kann und versuche es mit einem numerischen Wert:

%Vor%

aber dann bekomme ich:

%Vor%

Ich frage mich also, wie ich die 2D-Liste im Cython-Code deklarieren und machen kann. Ich konnte diese Art von Beispiel in der Dokumentation des Googelns für "Cython 2D-Liste" nicht finden

    
theta 02.01.2013, 09:01
quelle

2 Antworten

5
%Vor%

Dies deklariert ein C-Array von 500 C-Arrays mit 500 Doubles. Das sind 500 * 500 gepackte Double-Werte (die in diesem Fall auf dem Stack gespeichert sind, es sei denn, Cython macht etwas Funkhaftes) ohne Indirection, was die Performance und die Cache-Nutzung unterstützt, aber offensichtlich starke Einschränkungen hinzufügt. Vielleicht willst du das, aber du solltest genug C lernen, um zu wissen, was das zuerst bedeutet. Eine Einschränkung ist übrigens, dass die Größe eine Kompilierzeitkonstante sein muss (abhängig von der C-Version; C99 und C10 erlauben dies), worum es bei der ersten Fehlermeldung geht.

Wenn Sie Arrays verwenden, initialisieren Sie f nicht so, wie Sie es taten, weil das keinen Sinn ergibt. f ist bereits 500x500 doppelte Variablen, und Arrays als Ganzes können nicht zugewiesen werden (was die letzte Fehlermeldung Ihnen zu sagen versucht). Insbesondere erstellt das Listenverständnis ein vollständiges Python-Listenobjekt (das Sie auch aus Cython verwenden können, siehe unten), das vollständig "boxed" Python-Objekte enthält (in diesem Fall float -Objekte). Eine Liste ist nicht mit einem C-Array kompatibel. Verwenden Sie eine verschachtelte for -Schleife mit Elementzuordnung für die Initialisierung. Schließlich benötigt ein solches Array 500 * 500 * 8 Byte, was fast 2 MiB ist. Auf manchen Systemen ist das größer als der gesamte Stack und auf allen anderen Systemen ist es ein so großer Teil des Stacks, dass es eine schlechte Idee ist. Sie sollten das Array Heap-allokieren.

Wenn Sie eine Python-Liste verwenden, sollten Sie darauf achten, dass die Leistung und die Speicherbelegung nicht wesentlich verbessert werden (vorausgesetzt, dass Ihr Code diese Liste meist manipuliert). Du könntest einfach die cdef weglassen, oder list als Typ verwenden ( object sollte auch funktionieren, aber du bekommst nichts davon, also kannst du es auch weglassen).

Ein NumPy-Array ist möglicherweise schneller, speicherfreundlicher, und benutzerfreundlicher. Wenn Sie die performancekritischen Teile Ihres Algorithmus in Form von NumPy-Operationen implementieren können, können Sie die gewünschte Beschleunigung erzielen, ohne Cython überhaupt zu verwenden .

    
delnan 02.01.2013, 09:54
quelle
8

Verwenden Sie in Cython kein Listenverständnis. Es gibt keine Beschleunigung, da sie eine reguläre Python-Liste erstellen. Wiki sagt , dass Sie die dynamische Zuweisung in Cython wie folgt verwenden sollten:

%Vor%

Wenn Sie jedoch ein Python-Objekt eines 2D-Arrays benötigen, empfiehlt es sich, NumPy zu verwenden.

>     
Arpegius 02.01.2013 09:54
quelle

Tags und Links