gpt4 book ai didi

python - pickle cython类

转载 作者:太空狗 更新时间:2023-10-29 20:42:34 25 4
gpt4 key购买 nike

我必须保存和加载一个 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 模块。我知道我必须实现 __reduce__(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))

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

最佳答案

不知道你找到没有,Python官方文档有a section on pickling extension types (不幸的是,该文档似乎没有 Python 3 版本,但它在 Python 3 中的工作方式相同)。

我认为您在这里遇到了三个问题。首先,__reduce__ 返回的函数应该从头开始创建一个新对象并返回它,而您的rebuild 函数只是设置一些属性。其次,__reduce__ 返回的元组本身必须是可 picklable 的,作为一种方法,Perceptron_avg_my.rebuild 是不可 picklable 的(我认为这有望在 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

关于python - pickle cython类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com