当我发现一些好奇的东西时,我正在查看json
模块的来源,试图回答另一个问题。删除docstring和一大堆关键字参数,json.load
的来源如下:
def load(fp):
return loads(fp.read())
这根本不像我预期的那样。如果json.load
无法避免一次读取整个文件的开销,那么它是否比json.loads(f.read())
节省了几个字符的源代码的唯一优势?为什么它甚至存在?为什么它得到短名称,而不是loads
获取load
名称,load
获得名称loadf
?我可以想到原因(例如,复制pickle
界面),但任何人都可以提供权威答案而不是猜测吗?
答案 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?