我必须保存并加载一个cython类实例。 我的cython类是这个加上几个方法:
import numpy as np
cimport numpy as np
cimport cython
cdef class Perceptron_avg_my:
cdef int wlen,freePos
cdef np.ndarray w,wtot,wac,wtotc #np.ndarray[np.int32_t]
cdef np.ndarray wmean #np.ndarray[np.float32_t]
cdef public dict fpos
def __cinit__(self,np.int64_t wlen=4*10**7):
self.fpos= dict()
self.freePos=1
self.wlen=wlen
self.w=np.zeros(wlen,np.int32)
self.wtot=np.zeros(wlen,np.int32)
self.wac=np.zeros(wlen,np.int32)
self.wtotc=np.zeros(wlen,np.int32)
self.wmean=np.zeros(wlen,np.float32)
cpdef evaluate_noavg(self,list f):
cdef np.ndarray[np.int32_t] w = self.w
cdef dict fpos = self.fpos
cdef bytes ff
cdef int i
cdef long int score=0
for ff in f:
i=fpos.get(ff,0)
if i != 0:
score += w[i]
return score
我在考虑使用cPickle模块。 我知道我必须实现一个uuu reduce_uuu(self)方法,但是我在寻找一个例子和理解文档方面有一些问题
我试着在Perceptron_avg_my中添加类似的内容,但没有成功:
def rebuild(self,l):
self.fpos=l[0]
self.freePos=l[1]
def __reduce__(self):
#print 'reduce call'
return (Perceptron_avg_my.rebuild,(self.fpos,self.freePos))
有什么建议吗? 谢谢!!!
自Cython 0.26(2017年7月发布)起,不再需要执行pickle协议。所有不包含指针或联合的cdef类都可以自动进行pickle。对于包含结构的类,由于(除其他原因外)较高的代码开销,默认情况下会禁用自动选取。可以使用
@cython.auto_pickle(True)
装饰器为具有结构的类启用自动pickling。更多信息可以在changelog和the website of Stefan Behnel中找到。
我用了这个解决方法,但我不确定它是否是最好的解决方案。
我创建了一个新的支持文件来声明reduce调用的函数(如果我把它放在cython模块中,它就不工作了):
然后我在cython模块中导入这个函数:
当我使用感知器模块时,我只需要做:从感知器导入感知器,现在我可以在需要时执行cPyckle.dump或cPickle.load。
如果有人有更好的解决方案,非常感谢!!!
我不知道您是否找到了它,但是正式的Python文档中有a section on pickling extension types(不幸的是,这个文档似乎没有Python 3版本,但它在python3中的工作原理相同)。
我想你有三个问题。首先,由
__reduce__
返回的函数应该从头创建一个新对象并返回它,而rebuild
函数只设置一些属性。其次,由__reduce__
返回的元组本身必须是可拾取的,并且作为一种方法,Perceptron_avg_my.rebuild
是不可拾取的(我认为在python 3.3或3.4中应该会修复这个问题)。相反,您可以将其转换为模块级函数。最后,参数(self.fpos,self.freePos)
单独传递给rebuild
您不必自己解包元组。以下内容似乎对我有用(尽管您可能也希望存储其他属性的值,否则它们的初始值将由
__init__
设置):相关问题 更多 >
编程相关推荐