首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用ujson.dumps() python类实例(更快的深度复制)

是否可以使用ujson.dumps() python类实例(更快的深度复制)
EN

Stack Overflow用户
提问于 2017-09-08 19:30:20
回答 2查看 1.9K关注 0票数 1

我正在尝试快速复制一个类实例。cPickle.loads(cPickle.dumps(),-1)工作得很好,几乎比copy.deepcopy快5倍,但是我cPickle。我无法让ujson使用自定义类,可以这样做吗?

示例:

代码语言:javascript
复制
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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-08 20:06:45

一个想法是定义您自己的协议,这是为泡菜描述的概念的基础。在类中定义一个__getstate____setsatte__实例:

代码语言:javascript
复制
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()load()函数,如下所示:

代码语言:javascript
复制
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而不是经典文件):

代码语言:javascript
复制
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}}
票数 2
EN

Stack Overflow用户

发布于 2017-09-08 19:44:05

ujson没有序列化对象;它只是将其属性dict编码为JSON对象。没有足够的信息来完整地再现原始对象;最明显的迹象是,ujson.dumps输出中没有记录a类的实例。

usjoncPickle快得多的原因是cPickle需要做更多的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46123403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档