代码之家  ›  专栏  ›  技术社区  ›  muon

是否可以使用ujson。dumps()python类实例(更快的deepcopy)

  •  1
  • muon  · 技术社区  · 8 年前

    我试图快速复制一个类实例。 cPickle.loads(cPickle.dumps(),-1) 工作正常,几乎比 copy.deepcopy ,但我 read that ujson is much faster than cPickle . 我无法让ujson与自定义类一起工作,可以这样做吗?

    import cPickle as pickle
    import ujson
    
    class AClass(object):
        def __init__(self):
            print('init')
            self.v = 10
            self.z = [2,3,4]
            self._zdict = dict(zip(self.z,self.z))
    
    a = AClass()
    a
    #<__main__.AClass at 0x118b1d390>
    
    
    # does not work with ujson
    ua = ujson.dumps(a)
    au = ujson.loads(ua)
    au
    #{u'v': 10, u'z': [2, 3, 4]}
    
    
    # but works with pickle
    pa = pickle.dumps(a)
    ap = pickle.loads(pa)
    ap
    #<__main__.AClass at 0x117460190>
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   chepner    8 年前

    ujson 不是序列化 ; 它只是对其属性进行编码 dict 作为JSON对象。那里没有足够的信息来完整地再现原始对象;最明显的迹象是 ujson.dumps 记录什么课程 a

    原因 usjon cPickle 是吗 cPickle公司

        2
  •  2
  •   Laurent LAPORTE    8 年前

    一个想法是定义您自己的protocole,它是 pickle . 定义 __getstate__ __setsatte__ 类中的实例:

    class AClass(object):
        def __init__(self, v, z):
            self.v = v
            self.z = z
            self._zdict = dict(zip(self.z, self.z))
    
        def __repr__(self):
            return repr({'v': self.v, 'z': self.z, '_zdict': self._zdict})
    
        def __getstate__(self):
            return {'v': self.v, 'z': self.z}
    
        def __setstate__(self, state):
            self.__dict__.update(state)
            self._zdict = dict(zip(self.z, self.z))
    

    然后,您可以定义 save() 和a load() 功能如下:

    import importlib
    import json
    import io
    
    def save(instance, dst_file):
        data = {
            'module': instance.__class__.__module__,
            'class': instance.__class__.__name__,
            'state': instance.__getstate__()}
        json.dump(data, dst_file)
    
    
    def load(src_file):
        obj = json.load(src_file)
        module_name = obj['module']
        mod = importlib.import_module(module_name)
        cls = getattr(mod, obj['class'])
        instance = cls.__new__(cls)
        instance.__setstate__(obj['state'])
        return instance
    

    StringIO

    a_class = AClass(10, [2, 3, 4])
    my_file = io.StringIO()
    save(a_class, my_file)
    
    print(my_file.getvalue())
    # -> {"module": "__main__", "class": "AClass", "state": {"v": 10, "z": [2, 3, 4]}}
    
    my_file = io.StringIO(my_file.getvalue())
    instance = load(my_file)
    
    print(repr(instance))
    # -> {'v': 10, 'z': [2, 3, 4], '_zdict': {2: 2, 3: 3, 4: 4}}
    
    推荐文章