python处理JSON数据的那些库你了解多少?

python中经常会遇到处理JSON格式数据的情况,在程序中使用这类数据越多,就会面临编码或解码的问题。处理JSON数据,python内置的工具也不错,但是还有比这更多更好的选择。选择哪一个库或工具包,没有标准答案,但一般的选择标准或要求还是有一些共同点的。首先是要求处理速度快,但对于不同的使用场景、不同的人,专门处理JSON的库的用法也是不一样的;其次,追求速度快,并不是唯一的要求,还要考虑安全性和可定制等。

选择处理JSON数据速度最快的库,要首先确定速度如何度量,用什么样的度量标准,如何选取其他条件或要求等,下面就这一问题从四个方面来具体讲述。

如果python内置的处理JSON数据的工具包,没有明显的瓶颈,则没有必要考虑另外选择,判断的条件就是耗费在JSON数据编码的时间是否超过了程序使用者或编程者的预期,例如JSON数据编码的进程耗时超过整个CPU占用时间的25%,而处理速度仅仅提高了30%,并且在程序多次运行中,这类数据几乎达到最高值,那就可以认为,所使用的JSON处理工具在当前场景下遇到了瓶颈,可以考虑尝试其他同类工具。

根据数据的构成和处理方法选择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数据的库或工具包,还应考虑以下几个因素:

  • 安全性/健壮性:以上面的日志数据格式为例,日志信息包括来自不信任源的信息,如果JSON库或工具包处理这类数据出现故障,那么这样的工具可靠性或安全性就不是太好;
  • 定制编码:针对要处理的数据可以自己指定编码方式或方法,可以实现不同类型的python对象的序列化,有些JSON工具包或库支持这种技术方法,有的不支持;
  • 跨平台:所选的JSON数据处理工具或库是否可以在linux、windows或macOS上使用;
  • 提供维护:选择的JSON数据处理工具或库要有人持续的维护

根据个人经验,现在常见的JSON数据处理工具包或库有四个:orjson, rapidjson, ujson 和 hyperjson,其中ujson虽然有人维护,但并不是很积极,而hyperjson只适用于macOS操作系统,相比之下,orjson和rapidjson比较合适。

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.829106330871582
orjson 1.0466396808624268
rapidjson 2.1441543102264404

如果考虑到unicode解码的需要,那orjson的处理速度最快;从现在的使用情况看,使用orjson的用户要比rapidjson的用户少,orjson也没有被Conda纳入,安装时要自己打包,略有不便,总之可以肯定:orjson 是处理JSON数据最快的工具包,但是否需要,还是要看自己的选择或需求。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/76321
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 11 日
下一篇 2024 年 7 月 11 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注