Cython 类默认情况下不可腌制,因此您需要自己实现Pickle 接口。您可以在许多不同的级别上执行此操作,但这__getstate__
是__setstate__
对用户最友好的级别,因此除非您有充分的理由,否则这是一个很好的起点。
如果类的内容是可腌制的,那么就像返回它们的元组 in__getstate__
和 in 中的反向操作一样简单__setstate__
。Memoryviews 本身不是可腌制的,但具有base
可能的属性。
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
如果您的类包含 C 或 C++ 对象,那么它会复杂得多。对于简单类型的好地方,只需将内存复制到字节数组或利用 Cython 的默认struct<->dict
互转换。但是,如果该类包含指针,那么这将不起作用,您需要在 C/C++ 中为其实现可靠的加载/保存机制。