【发布时间】:2016-10-18 02:51:08
【问题描述】:
我正在使用 simplejson 将 json 字符串反序列化为 python 对象。我有一个自定义编写的 object_hook,负责将 json 反序列化回我的域对象。
问题是,当我的 json 字符串很大时(即服务器以 json 字符串的形式返回大约 800K 域对象),我的 python 反序列化器需要将近 10 分钟来反序列化它们。
我进一步深入研究,看起来 simplejson 并没有做太多工作,而是将所有内容委托给 object_hook。我尝试优化我的 object_hook 但这也没有提高我的性能。 (我几乎没有 1 分钟的改进)
我的问题是,我们是否有任何其他标准框架经过优化以处理庞大的数据集,或者有没有一种方法可以让我利用框架的功能,而不是在 object_hook 级别做所有事情。
我看到,如果没有 object_hook,框架只返回一个字典列表,而不是域对象列表。
这里的任何指针都会很有用。
仅供参考,我使用的是 simplejson 版本 3.7.2
这是我的 _object_hook 示例:
def _object_hook(dct):
if '@CLASS' in dct: # server sends domain objects with this @CLASS
clsname = dct['@CLASS']
# This is like Class.forName (This imports the module and gives the class)
cls = get_class(clsname)
# As my server is in java, I convert the attributes to python as per python naming convention.
dct = dict( (convert_java_name_to_python(k), dct[k]) for k in dct.keys())
if cls != None:
obj_key = None
if "@uuid"in dct
obj_key = dct["@uuid"]
del(dct["@uuid"])
else:
info("Class missing uuid: " + clsname)
dct.pop("@CLASS", None)
obj = cls(**dct) #This I found to be the most time consuming process. In my domian object, in the __init__ method I have the logic to set all attributes based on the kwargs passed
if obj_key is not None:
shared_objs[obj_key] = obj #I keep all uuids along with the objects in shared_objs dictionary. This shared_objs will be used later to replace references.
else:
warning("class not found: " + clsname)
obj = dct
return obj
else:
return dct
示例响应:
{"@CLASS":"sample.counter","@UUID":"86f26a0a-1a58-4429-a762- 9b1778a99c82","val1":"ABC","val2":1131,"val3":1754095,"value4": {"@CLASS":"sample.nestedClass","@UUID":"f7bb298c-fd0b-4d87-bed8- 74d5eb1d6517","id":1754095,"name":"XYZ","abbreviation":"ABC"}}
我有很多级别的嵌套,我从服务器接收到的记录数超过 800K。
【问题讨论】:
-
看起来很有趣。任何用于快速检查的示例 sn-p 都会很有用。
-
如果您可以发布您的
object_hook函数的代码和您要解析的 JSON 示例,这将有助于我们回答您的问题。
标签: python json performance python-2.7 simplejson