Iteration über eine Liste, in parallele mit Cython
Wie macht man iteriert parallel über ein (Python -) Liste in Cython?
Betrachten Sie die folgende einfache Funktion:
def sumList():
cdef int n = 1000
cdef int sum = 0
ls = [i for i in range(n)]
cdef Py_ssize_t i
for i in prange(n, nogil=True):
sum += ls[i]
return sum
Dies gibt eine Menge von compiler-Fehler, da einem parallelen Abschnitt ohne die GIL anscheinend nicht die Arbeit mit Python-Objekt:
Error compiling Cython file:
------------------------------------------------------------
...
ls = [i for i in range(n)]
cdef Py_ssize_t i
for i in prange(n, nogil=True):
sum += ls[i]
^
------------------------------------------------------------
src/parallel.pyx:42:6: Coercion from Python not allowed without the GIL
Error compiling Cython file:
------------------------------------------------------------
...
ls = [i for i in range(n)]
cdef Py_ssize_t i
for i in prange(n, nogil=True):
sum += ls[i]
^
------------------------------------------------------------
src/parallel.pyx:42:6: Operation not allowed without gil
Error compiling Cython file:
------------------------------------------------------------
...
ls = [i for i in range(n)]
cdef Py_ssize_t i
for i in prange(n, nogil=True):
sum += ls[i]
^
------------------------------------------------------------
src/parallel.pyx:42:6: Converting to Python object not allowed without gil
Error compiling Cython file:
------------------------------------------------------------
...
ls = [i for i in range(n)]
cdef Py_ssize_t i
for i in prange(n, nogil=True):
sum += ls[i]
^
------------------------------------------------------------
src/parallel.pyx:42:11: Indexing Python object not allowed without gil
- Das ist vielleicht nicht unmittelbar nützlich, aber haben Sie jemals versucht, D??? Es ist c-syntax, und Sachen, wie die parallele iteration über Listen (arrays oder Bereiche in D) ist fast so einfach, wie es zu tun in MATLAB, wenn Sie vertraut sind. Check-out die Beispiel hier: . std.Parallelität. Ich fand es sehr leicht von einem Python-hintergrund.
- Nie versucht, D, werfen Sie einen Blick.
- Experimentiert mit D, mochte die pythonic syntax. Aber hier ist ein Problem, das ich gestoßen bin: stackoverflow.com/questions/17837098/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich kenne keine Möglichkeit, dies zu tun. Eine Liste ist ein Python-Objekt, so mit seiner
__getitem__
Methode erfordert die GIL. Wenn Sie sind in der Lage, einen NumPy-array in diesem Fall, es wird funktionieren. Zum Beispiel, wenn Sie wollten, dass die Iteration über ein arrayA
von double-precision-floating-point-Werte könnte man etwas wie das hier tun:Auf meinem Rechner, für diesen speziellen Fall, prange macht es nicht schneller, als eine normale Schleife, aber es könnte besser funktionieren, in anderen Fällen. Weitere Informationen zur Verwendung prange finden Sie in der Dokumentation zu http://docs.cython.org/src/userguide/parallelism.html
Ob oder nicht, können Sie ein array verwenden, hängt davon ab, wie viel ändern Sie die Größe des Arrays. Wenn Sie eine Menge Flexibilität mit der Größe der Arrays wird nicht funktionieren. Sie könnten auch versuchen, dich mit dem
vector
Klasse in C++. Ich habe noch nie getan, dass ich mich, aber es ist eine kurze Beschreibung, wie Sie das hier tun: http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#nested-class-declarationssum
Methode der NumPy-arrays.Konvertieren Sie Ihre Liste in ein array, wenn Sie müssen einen numerischen Wert ein, oder ein bytearray, wenn Werte begrenzt sind, die zwischen 0 und 255. Wenn Sie speichern nichts anderes als numerische Werte, versuchen numpy oder verwenden Sie dtypes direkt. Zum Beispiel mit Byte:
Und wenn Sie möchten, verwenden Sie C-Typen:
ctypedef unsigned char uint8_t