Come si esegue un'iterazione in parallelo su un elenco (Python) in Cython?Iterazione su un elenco in parallelo con Cython
Si consideri il seguente semplice funzione:
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
Questo dà un sacco di errori di compilazione, perché una sezione parallela senza il GIL a quanto pare non può funzionare con qualsiasi oggetto Python:
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
Questo potrebbe non essere immediatamente utile, ma avete mai provato D? È sintassi c e cose come l'iterazione parallela sugli elenchi (array o intervalli in D) è quasi facile come farlo in MATLAB, se sei familiare. Guarda l'esempio qui: [std.parallelism] (http://dlang.org/phobos/std_parallelism). Ho trovato molto facile da ottenere da uno sfondo di Python. –
@mattyTpain Non ho mai provato D, dare un'occhiata. – clstaudt
@mattyTpain Sperimentato con D, è piaciuta la sintassi pythonic. Ma ecco un problema che ho riscontrato: http://stackoverflow.com/questions/17837098/parallel-iterators-in-the-d-language – clstaudt