Cython-Klassen sind standardmäßig nicht pickbar, daher müssen Sie die Pickle interface selbst implementieren. Es gibt eine Reihe von verschiedenen Ebenen, auf denen Sie dies tun können, aber __getstate__
und __setstate__
ist die benutzerfreundlichste Ebene, so dass es ein guter Ort ist, um zu starten, es sei denn, Sie haben andere gute Gründe.
Wenn der Inhalt der Klasse pickleable ist, ist es so einfach wie ein Tupel von ihnen in __getstate__
und der umgekehrte Vorgang in __setstate__
zurückgeben. Memoryviews selbst sind nicht pickbar, haben aber möglicherweise ein base
Attribut.
cdef class C:
cdef double[:] array
cdef python_obj
cdef int integer
def __init__(self,array,python_obj,integer):
self.array = array
self.python_obj = python_obj
self.integer = integer
def __getstate__(self):
return (self.array.base, # memoryviews aren't pickleable, need to get underlying object
# and hope it's pickleable
self.python_obj, self.integer)
def __setstate__(self,x):
self.array, self.python_obj, self.integer = x
Wenn Ihre Klasse ein C- oder C++ - Objekt enthält, ist es viel komplizierter. Für einfache Typen gute Startpunkte sind nur kopieren Sie den Speicher in ein Bytearray oder nutzen Cythons Standard Interconversion. Wenn die Klasse jedoch Zeiger enthält, funktioniert dies nicht und Sie müssen einen zuverlässigen Lade-/Speichermechanismus in C/C++ implementieren.
Es gibt eine Menge Dokumentation und vorherige Fragen, dass es nicht so aussieht, wie Sie es gelesen haben: wie https://docs.python.org/3/library/pickle.html#what-can-be- pickled-and-unpickled ([Erweiterungstypen definieren standardmäßig kein '__dict__') (http://cython.readthedocs.io/en/latest/src/reference/extension_types.html#attributes)). Ein paar relevante vorherige Fragen: http://stackoverflow.com/questions/12646436/pickle-cython-class http://stackoverflow.com/questions/36301322/pickle-cython-class-with-c-pointer – DavidW
Auch Ihre Der Titel erwähnt Zeiger, aber Ihr Code zeigt keine an. Vielleicht klarstellen? – DavidW
@DavidW danke ich habe es korrigiert! –