泡菜cython类

Fra*_*sco 9 python reduce class pickle cython

我必须保存并加载一个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
Run Code Online (Sandbox Code Playgroud)

我在考虑使用cPickle模块.我明白我必须实现一个__reduce __(自我)方法但是我有一些问题需要找到一个例子并且很好地理解文档

我试图将这样的东西添加到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))
Run Code Online (Sandbox Code Playgroud)

有什么建议?非常感谢!!!

Jam*_*mes 9

我不知道你是否找到它,但官方的Python文档有一个关于pickle扩展类型的部分(遗憾的是,似乎没有这个文档的Python 3版本,但它在Python 3中的工作方式相同).

我想你在这里有三个问题.首先,返回的函数__reduce__应该从头创建一个新对象并返回它,而你的rebuild函数只是设置一些属性.其次,返回的元组__reduce__本身必须是可选择的,并且作为一种方法,Perceptron_avg_my.rebuild不可选择(我认为这应该在python 3.3或3.4中修复).相反,您可以将其转换为模块级功能.最后,参数(self.fpos,self.freePos)rebuild单独传递- 您不必自己解包元组.

以下似乎对我有用(尽管你可能也希望存储其他属性的值,否则它们只会设置初始值__init__):

#inside the class definition
def __reduce__(self):
    return (rebuild, (self.wlen, self.fpos, self.freePos))

#standalone function
def rebuild(wlen, fpos, freePos):
    p = Perceptron_avg_my(wlen)
    p.fpos = fpos
    p.freePos = freePos
    return p
Run Code Online (Sandbox Code Playgroud)


m00*_*0am 5

从 Cython 0.26(2017 年 7 月发布)开始,不再需要实现 pickle 协议。所有不包含指针或联合的 cdef 类都可以自动被酸洗。对于包含结构体的类,由于(除其他原因外)高代码开销,默认情况下禁用自动酸洗。可以使用@cython.auto_pickle(True)装饰器为具有结构的类启用自动酸洗。

更多信息可以在更新日志Stefan Behnel 的网站上找到。

  • 很高兴看到新版本!但是我仍然必须实现我自己的酸洗机制 b/c `TypeError: no default __reduce__ 由于非平凡的 __cinit__` (6认同)