Python numba类的序列化

Python numba类的序列化,python,numba,Python,Numba,有没有好的模式可以序列化/反序列化(酸洗)numba类? 下面是我的一个例子 other = pkl.loads(pkl.dumps(jc)) File "/usr/lib/python2.7/copy_reg.py", line 71, in _reduce_ex state = base(self) TypeError: function takes at most 0 arguments (1 given) 我想上很多课 @jitclass([ ('uncal

有没有好的模式可以序列化/反序列化(酸洗)numba类? 下面是我的一个例子

    other = pkl.loads(pkl.dumps(jc))
  File "/usr/lib/python2.7/copy_reg.py", line 71, in _reduce_ex
    state = base(self)
TypeError: function takes at most 0 arguments (1 given)
我想上很多课

@jitclass([
    ('uncal_minRange', float64),
    ('uncal_maxRange', float64),
    ('nSize', int64),
    ('cal_percent', int64),
])
class SomeJitClass(object):
    def __init__(self, uncal_minRange=0.0, uncal_maxRange=0.0, nSize=0, cal_percent=0.0 ):
        self.uncal_minRange   = uncal_minRange
        self.uncal_maxRange   = uncal_maxRange
        self.cal_percent      = cal_percent
        self.nSize = nSize

    def compare(self, other):
        return self.uncal_minRange == other.uncal_minRange and \
            self.uncal_maxRange == other.uncal_maxRange and \
            self.cal_percent == other.cal_percent and \
            self.nSize == other.nSize


import unittest
class FastOpsTest(unittest.TestCase):

    def test_jit_class(self):
        import cPickle as pkl
        jc = SomeJitClass(1,2,3,4)
        print jc
        self.assertTrue(jc.compare(SomeJitClass(1,2,3,4)))
        self.assertFalse(jc.compare(SomeJitClass(1,2,3,5)))
        other = pkl.loads(pkl.dumps(jc))
        self.assertTrue(jc.compare(other))

下面是一个可能的解决方案,但作为旁白,我发现在当前(2018年初)的实现中很难推荐使用jitclass——只是有点太过严格/不成熟。如果可能的话,我会尝试使用普通数组/自由函数,和/或namedtuples是捆绑一些相关状态的一个很好的解决方案。另外,cython是开发更丰富类型的好工具,可以更好地使用python

也就是说,这里有一个可能的解决方法。我使用了一点numba的内部结构,所以未来可能不稳定

def dumps_jitclass(jc):
    typ = jc._numba_type_
    fields = typ.struct

    data = {
        'name': typ.classname,
        'struct': {k: getattr(jc, k) for k in fields}
    }
    return pickle.dumps(data)

def loads_jitclass(s):
    data = pickle.loads(s)
    cls = globals()[data['name']]
    instance = cls(**data['struct'])
    return instance

# usage
In [148]: jc = loads_jitclass(dumps_jitclass(SomeJitClass(1, 2, 3, 4)))

In [149]: oth = SomeJitClass(1, 2, 3, 4)

In [150]: jc.compare(oth)
Out[150]: True

下面是一个可能的解决方案,但作为旁白,我发现在当前(2018年初)的实现中很难推荐使用jitclass——只是有点太过严格/不成熟。如果可能的话,我会尝试使用普通数组/自由函数,和/或namedtuples是捆绑一些相关状态的一个很好的解决方案。另外,cython是开发更丰富类型的好工具,可以更好地使用python

也就是说,这里有一个可能的解决方法。我使用了一点numba的内部结构,所以未来可能不稳定

def dumps_jitclass(jc):
    typ = jc._numba_type_
    fields = typ.struct

    data = {
        'name': typ.classname,
        'struct': {k: getattr(jc, k) for k in fields}
    }
    return pickle.dumps(data)

def loads_jitclass(s):
    data = pickle.loads(s)
    cls = globals()[data['name']]
    instance = cls(**data['struct'])
    return instance

# usage
In [148]: jc = loads_jitclass(dumps_jitclass(SomeJitClass(1, 2, 3, 4)))

In [149]: oth = SomeJitClass(1, 2, 3, 4)

In [150]: jc.compare(oth)
Out[150]: True

感谢@chrisb的回答。我对我的项目做了一些修改(从一个装饰初学者开始)

导入pickle
从functools导入包装,更新包装
将numpy作为np导入
来自numba导入类,int32,float64
类pickler:
'''
泡菜机
'''
定义初始化(self,jitobj):
self._dict___['obj']=jitobj
self.\uuuu dict\uuuuu[“uuuu模块”\uuuuuu']=jitobj.\uuuu模块__
self.\uuuu dict\uuuuuu[“uuuuu doc”]=jitobj.\uuuu doc__
定义获取状态(自身):
obj=自我
类型=对象类型_
字段=typ.struct
返回typ.classname,{k:getattr(obj,k)表示字段中的k}
定义设置状态(自身、状态):
名称,值=状态
cls=globals()[名称]
值['''u decorator']=False
jitobj=cls(**值)
自我初始化(jitobj)
def _ugetattr _;(self,attr):
返回getattr(self.u dict_uj['obj'],attr)
定义设置属性(自身、属性、值):
返回setattr(self.u dict_uj['obj'],attr,value)
定义(自我,属性):
返回delattr(self.u dict_uj['obj'],attr)
def JIT酸洗(cls):
decoratorkw=“\u decorator”
@包装(cls)
def装饰器(*args,**kwargs):
如果kwargs.get(decorcorkw,True):
kwargs.pop(装饰性,无)
返回处理器(cls(*args,**kwargs))
其他:
kwargs.pop(装饰性,无)
返回cls(*args,**kwargs)
返回装饰器
什么时候使用它

spec=[
('value',int32),
('array',float64[:])]
@泡菜
@JIT等级(规范)
类别cls:
定义初始化(自、值、数组):
自我价值=价值
self.array=array
a=cls(10,np.数组([1.1,2.2]))
s=酸洗。转储(a)
b=酸洗负荷
打印(b.值,b.数组)

Ps:
update\u wrapper
在重载
\uuuuuu setattr\uuuuu
时效果不佳。而且我不想让
\uuuuu setattr\uuuuuuuu
太胖。

多亏@chrisb的回答。我对我的项目做了一些修改(从一个装饰初学者开始)

导入pickle
从functools导入包装,更新包装
将numpy作为np导入
来自numba导入类,int32,float64
类pickler:
'''
泡菜机
'''
定义初始化(self,jitobj):
self._dict___['obj']=jitobj
self.\uuuu dict\uuuuu[“uuuu模块”\uuuuuu']=jitobj.\uuuu模块__
self.\uuuu dict\uuuuuu[“uuuuu doc”]=jitobj.\uuuu doc__
定义获取状态(自身):
obj=自我
类型=对象类型_
字段=typ.struct
返回typ.classname,{k:getattr(obj,k)表示字段中的k}
定义设置状态(自身、状态):
名称,值=状态
cls=globals()[名称]
值['''u decorator']=False
jitobj=cls(**值)
自我初始化(jitobj)
def _ugetattr _;(self,attr):
返回getattr(self.u dict_uj['obj'],attr)
定义设置属性(自身、属性、值):
返回setattr(self.u dict_uj['obj'],attr,value)
定义(自我,属性):
返回delattr(self.u dict_uj['obj'],attr)
def JIT酸洗(cls):
decoratorkw=“\u decorator”
@包装(cls)
def装饰器(*args,**kwargs):
如果kwargs.get(decorcorkw,True):
kwargs.pop(装饰性,无)
返回处理器(cls(*args,**kwargs))
其他:
kwargs.pop(装饰性,无)
返回cls(*args,**kwargs)
返回装饰器
什么时候使用它

spec=[
('value',int32),
('array',float64[:])]
@泡菜
@JIT等级(规范)
类别cls:
定义初始化(自、值、数组):
自我价值=价值
self.array=array
a=cls(10,np.数组([1.1,2.2]))
s=酸洗。转储(a)
b=酸洗负荷
打印(b.值,b.数组)

Ps:
update\u wrapper
在重载
\uuuuuu setattr\uuuuu
时效果不佳。而且我不想把
\uuuuu setattr\uuuuuuu
弄得太胖。

谢谢。这并不是很理想,因为您不能将其用于包含对象的嵌套结构。然而,您似乎可以将此方法与实现上述get\u state\uu/\uu set\u state的mixin集成。我去看看。谢谢。这并不是很理想,因为您不能将其用于包含对象的嵌套结构。然而,您似乎可以将此方法与实现上述get\u state\uu/\uu set\u state的mixin集成。我来看看。