Ich möchte ein Array-Pufferobjekt verwenden, das sowohl in Python als auch in C auf Cython verwendet werden kann. Es scheint, dass es Cythons cython.view.array
und CPythons array.array
gibt.
Cython array
Verwenden Sie cython.view.array
.
cython
from cython.view cimport array # note that this is 'c'-import
arr = array(shape=(3,3,3), itemsize=sizeof(int), format='i')
Im Fall von Python float würden Sie double with'd 'verwenden. Als Anordnung im Speicher können Sie das Schlüsselwort "mode" in cython verwenden, wie order in numpy.
Durch direktes Zuweisen zu einem Array des entsprechenden Datentyps kann es als C-Array (oder Zeiger) behandelt werden (tatsächlich befindet sich die "Ansicht" für das Array im C-Array).
cython
from cython.view cimport array
arr = array(shape=(3, 10), itemsize=sizeof(double), format='d')
cdef double[:,:] carr2d = arr # 2D C-array view
cdef double[:] carr1d = arr # 1D C-array view
Sie kann nicht nur durch explizite Zuweisung wie oben ausgelöst werden, sondern auch durch Angabe von Funktionsargumenten.
cython
cpdef double process(double[:,:] view) nogil:
...
arr = array(shape=(3, 10), itemsize=sizeof(double), format='d')
process(arr)
Python array
Erfordert `Array importieren``` in Python-Anweisungen und`
aus cpython cimport array``` als Cython-Typinformationen.
In Benchmark on StackOverflow aus "cython array" Es ist auch schnell ", aber ich weiß nicht, wie es wirklich ist.
Es scheint auch, dass es nur grundlegende eindimensionale Arrays verarbeiten kann. Daher kann es problematisch sein, wenn Sie auf zwei Dimensionen in Cython zugreifen möchten.
Im Moment ist die einzige Möglichkeit, es so zu machen, dass es wie "numpy.empty ()" funktioniert, die Verwendung von "clone ()".
cython
from cpython cimport array as carray
import array
cdef carray.array template = array.array('d')
cdef carray.array buffer = carray.clone(template, 1000, zero=False)
#Dieser Klon()Die Funktion ist auf der Cython-Seite definiert
# 'zero'Geben Sie an, ob mit einem Schlüsselwort auf Null initialisiert werden soll
data
An die Mitgliederas_xxxs
Oder```as_voidptr``Feld ist definiert, dies ist ein Array/Dient als Zeiger.
cython
from libc.stdio cimport printf
printf ("% c", buffer.data.as_chars [0]) # Gibt das erste Element aus
Der Zugriff auf diesen Zeiger ist gefährlich, da keine Typprüfung erfolgt, aber schnell, da er nicht an GIL gebunden ist.
Ichiou Memoryview-Methode kann zugewiesen werden (aber GIL ist erforderlich). In diesem Fall ist unklar, ob eine Ansicht mit zwei oder mehr Dimensionen erstellt werden kann.
#Einfach zu verwendende Konvertierung unter Python
##Konvertierung in Python-String
eindimensionales Array vom Bytetyp(Aussicht)Im Fall von kann es in eine Python-Zeichenfolge konvertiert werden.
cython
pystring = bytearr.tobytes().decode('utf8')
# Geben Sie die entsprechende Codierung an
##Umstellung auf NumPy ndarray
cython.view.Array ist auch Array.Array kann auch als Pufferobjekt verwendet werden, also numpy.asarray()Und numpy.array()Es scheint, dass es mit konvertiert werden kann.
#Zusammenfassung
Funktionell ist es nicht so anders.
+Wenn Sie Geschwindigkeit wollen, auch wenn es eine Dimension wird```array.array```Wäre besser.
+Wenn Sie es als mehrdimensionales Array in Cython verwenden möchten```cython.view.array```Wäre besser.
Recommended Posts