python中经常会遇到处理JSON格式数据的情况,在程序中使用这类数据越多,就会面临编码或解码的问题。处理JSON数据,python内置的工具也不错,但是还有比这更多更好的选择。选择哪一个库或工具包,没有标准答案,但一般的选择标准或要求还是有一些共同点的。首先是要求处理速度快,但对于不同的使用场景、不同的人,专门处理JSON的库的用法也是不一样的;其次,追求速度快,并不是唯一的要求,还要考虑安全性和可定制等。
选择处理JSON数据速度最快的库,要首先确定速度如何度量,用什么样的度量标准,如何选取其他条件或要求等,下面就这一问题从四个方面来具体讲述。
如果python内置的处理JSON数据的工具包,没有明显的瓶颈,则没有必要考虑另外选择,判断的条件就是耗费在JSON数据编码的时间是否超过了程序使用者或编程者的预期,例如JSON数据编码的进程耗时超过整个CPU占用时间的25%,而处理速度仅仅提高了30%,并且在程序多次运行中,这类数据几乎达到最高值,那就可以认为,所使用的JSON处理工具在当前场景下遇到了瓶颈,可以考虑尝试其他同类工具。
选择更合适的JSON处理库或工具包,要考虑当前的程序环境中是否有编码或解码或两者都有的需求、要处理的数据信息的量是否很大、数据信息的构成是什么样等。看看下面一个日志数据的例子,数据特性较少,需要编码:
{ "timestamp": 1556283673.1523004, "task_uuid": "0ed1a1c3-050c-4fb9-9426-a7e72d0acfc7", "task_level": [1, 2, 1], "action_status": "started", "action_type": "main", "key": "value", "another_key": 123, "and_another": ["a", "b"],}程序运行的性能是个广泛的概念,也是优缺点平衡的结果,并不是所有各方面达到最优,因此选择处理JSON数据的库或工具包,还应考虑以下几个因素:
根据个人经验,现在常见的JSON数据处理工具包或库有四个:orjson, rapidjson, ujson 和 hyperjson,其中ujson虽然有人维护,但并不是很积极,而hyperjson只适用于macOS操作系统,相比之下,orjson和rapidjson比较合适。
以下是orjson和rapidjson的使用实例,
m = { "timestamp": 1556283673.1523004, "task_uuid": "0ed1a1c3-050c-4fb9-9426-a7e72d0acfc7", "task_level": [1, 2, 1], "action_status": "started", "action_type": "main", "key": "value", "another_key": 123, "and_another": ["a", "b"],}def benchmark(name, dumps): start = time.time() for i in range(1000000): dumps(m) print(name, time.time() - start)benchmark("Python", json.dumps)# orjson 只输出字节, 但是通常情况下要使用unicode编码:benchmark("orjson", lambda s: str(orjson.dumps(s), "utf-8"))benchmark("rapidjson", rapidjson.dumps)输出结果如下:
$ python jsonperf.py Python 4.829106330871582orjson 1.0466396808624268rapidjson 2.1441543102264404如果考虑到unicode解码的需要,那orjson的处理速度最快;从现在的使用情况看,使用orjson的用户要比rapidjson的用户少,orjson也没有被Conda纳入,安装时要自己打包,略有不便,总之可以肯定:orjson 是处理JSON数据最快的工具包,但是否需要,还是要看自己的选择或需求。
(本文完)
| 留言与评论(共有 0 条评论) “” |