json.load效率低下吗?

时间:2013-12-31 10:34:22

标签: python json

当我发现一些好奇的东西时,我正在查看json模块的来源,试图回答另一个问题。删除docstring和一大堆关键字参数,json.load的来源如下:

def load(fp):
    return loads(fp.read())

这根本不像我预期的那样。如果json.load无法避免一次读取整个文件的开销,那么它是否比json.loads(f.read())节省了几个字符的源代码的唯一优势?为什么它甚至存在?为什么它得到短名称,而不是loads获取load名称,load获得名称loadf?我可以想到原因(例如,复制pickle界面),但任何人都可以提供权威答案而不是猜测吗?

2 个答案:

答案 0 :(得分:2)

虽然我们很自然地期望json.load()做得更好,正如评论中提到的那样,它并不能保证这样做。这纯粹是推测性的,但如果我是Python维护者,我会设计模块以简化和最少的维护开销。

Python标准库json模块在​​速度方面或内存使用方面并不是最佳的。对于不同的甜点有许多替代的JSON读取实现,并且其中一些具有Python绑定,例如Jansson

https://stackoverflow.com/a/3512887/315168

替代JSON实现源于以有效方式处理流式传输和/或大量数据的必要性。

答案 1 :(得分:0)

可以肯定地说,从文件中读取JSON虽然很重要,但它并不是JSON序列化的主要用例。因此,从文件中实现高效的JSON加载并不是那么有趣,除非在特殊情况下(有更有效的方法将大型数据结构序列化到磁盘)。

然而,概括概念可能会引入一些有用的方面(例如,来自网络流的JSON反序列化,或来自管道的渐进式JSON反序列化)。

我们正在寻找的是一个流解析器(例如像SAX for XML)。 YAJL是一种常见的解析器,它有some Python bindings

另请参阅此问题的最佳答案:Is there a streaming API for JSON?