Wie erklären 2D-Liste in Cython
Ich versuche zu kompilieren code dieser Art:
def my_func(double c, int m):
cdef double f[m][m]
f = [[c for x in range(m)] for y in range(m)]
...
wirft:
Error compiling Cython file:
------------------------------------------------------------
def grow(double alpha, double beta, double gamma, int m, int s):
cdef double f[m][m]
^
------------------------------------------------------------
test.pyx:6:22: Not allowed in a constant expression
nach dem ich davon ausgehen kann ich nicht die variable an der Spitzen Stelle und ich versuche mit numerischer Wert:
def my_func(double c, int m):
cdef double f[500][500]
f = [[c for x in range(500)] for y in range(500)]
...
dann bekomme ich aber:
Error compiling Cython file:
------------------------------------------------------------
f = [[beta for x in range(500)] for y in range(500)]
^
------------------------------------------------------------
test.pyx:13:6: Assignment to non-lvalue 'f'
So, ich bin Fragen, wie zu erklären, und stellen Sie den 2D-Liste in cython-code. Ich konnte nicht finden, dass diese Art von Beispiel in der Dokumentation googeln für "cython 2D-Liste"
- Nun, wenn ich verlassen Erklärung, bekomme ich kompilierten code aus, also denke ich, dass meine Erklärung falsch ist
- Tun Sie wirklich wollen, eine Liste von Listen, oder eine 2d-C-array?
- Ja, es ist wie es geschrieben ist. Ich versuche, die Beschleunigung sehr langsam Python-code durchläuft in einer Schleife jedes element dieses (und zwei weitere) Listen. Stell dir vor, wie langsam er ist.
- Das war eine entweder-oder-Frage. Sie erklärt, ein 2d-C-array, aber die Verwendung von Python-Listen initialisieren
f
, so versuche ich herauszufinden, ob Sie verwirren die zwei (oder gar nicht bewusst der Unterschied, wie Ihre Sprache zeigt) oder wollen eine spezifische und sind nur mit falsche syntax. - Ja learning Cython 🙂 In der Dokumentation die ich sah-Objekt, das erschien mir als Python-Liste, erklärt, wie
p[1000]
so dass ich dachte, ich sollte erklären, Liste wie. Sollte ich versuchen zu erklären, oder Listen, die nicht deklariert werden müssen? Ich sah hier das Beispiel: docs.cython.org/src/userguide/tutorial.html#primes
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist die Deklaration einer C-array von 500 C arrays von 500 verdoppelt. Das ist 500 * 500 verpackt double-Werte (auf dem stack gespeichert werden, in diesem Fall, wenn Cython macht etwas Irre) ohne Dereferenzierung, die aids-Leistung und cache-Auslastung, aber offensichtlich fügt schweren Einschränkungen. Vielleicht wollen Sie dies, aber Sie sollten erfahren genug C um zu wissen, was das bedeutet erste. Durch die Art und Weise, eine Einschränkung ist, dass die Größe muss eine compile-Zeit-Konstante (abhängig von der C-version; C99 und C10 erlauben es), das ist, was die erste Fehlermeldung ist über.
Wenn Sie arrays verwenden, müssen Sie nicht initialisieren
f
die Art und Weise war, weil das macht keinen Sinn.f
ist schon 500x500 double-Variablen und-arrays als ganzes kann nicht zugeordnet werden (das ist das, was die letztere Fehlermeldung versucht, Ihnen zu sagen). Insbesondere, list comprehension erstellt einen voll ausgewachsenen Python-list-Objekt (die könnte man auch die Verwendung von Cython, siehe unten) mit voll ausgewachsenen "boxed" Python-Objekte (float
Objekte, in diesem Fall). Eine Liste ist nicht kompatibel mit einem C-array. Verwenden Sie eine verschachteltefor
- Schleife mit Punkt-Zuordnung für die Initialisierung. Schließlich, so ein array nimmt 500 * 500 * 8 byte, das ist fast 2 MB). Auf einigen Systemen, die größer als der gesamte stack, und auf allen anderen Systemen, es ist so ein großer Teil von dem Stapel, dass es eine schlechte Idee. Sollten Sie die heap-Zuweisung das array.Wenn Sie eine Python-Liste, werden Sie gewarnt, dass Sie nicht viel Verbesserung in der Leistung und Speicher zu verwenden (vorausgesetzt, Ihr code wird meist die Manipulation dieser Liste), auch wenn Sie möglicherweise den gain wieder etwas Komfort zurück. Sie könnten nur lassen Sie die
cdef
oder verwendenlist
als der Typ (object
sollte auch funktionieren, aber Sie gewinnen nichts von ihm, so dass Sie könnte genauso gut weglassen).Einen NumPy-array können schneller, speichereffizienter, und mehr bequem zu bedienen. Wenn Sie implementieren können, das performance-kritische Teile des Algorithmus in Bezug auf die NumPy-Operationen, können Sie an den gewünschten speedup ohne Cython mit an alle.
Verwenden Sie keine Liste Verständnis in Cython. Es gibt keine Beschleunigungen, wie Sie erstellen regelmäßige python-Liste. Wiki sagt, sollten Sie die dynamische Zuordnung in Cython wie folgt:
Aber wenn Sie brauchen, um ein python-Objekt ein 2D-array, und es empfiehlt sich die Verwendung NumPy.
malloc
und ähnliche Begriffe. Ich bin noch nicht da, und es ist einfacher für mich zu verwenden, f2py, aber starten wollte, mit Cython für eine lange Zeit. Als ich antwortete, ich werde jetzt versuchen, mit Cython und Numpy-arrays statt Cython-und Python-Listen. Dank