我正在查看json
模块的源代码,试图回答另一个问题,这时我发现了一些奇怪的东西。除去docstring和一大堆关键字参数,json.load
的来源如下:
def load(fp):
return loads(fp.read())
这一点都不像我预料的那样。如果json.load
不能避免一次读取整个文件的开销,那么它相对于json.loads(f.read())
的唯一优势是节省几个字符的源代码吗?为什么它会存在?为什么它得到短名称,而不是loads
得到load
名称,load
得到一个类似loadf
的名称?我可以想出原因(例如复制pickle
接口),但是有谁能提供一个权威的答案而不是猜测?在
尽管正如评论中提到的,期望
json.load()
做得更好是很自然的,但它并不保证这样做。这纯粹是推测性的,但是如果我是Python维护人员,我会以简单和最少的维护开销来设计模块。在Python标准库
json
模块在速度和内存使用方面都不是最佳的。对于不同的热点,有许多可选的JSON读取实现,其中一些具有Python绑定,例如Jansson:https://stackoverflow.com/a/3512887/315168
另一种JSON实现源于高效地处理流和/或大量数据的需要。在
可以肯定地说,从文件中读取JSON虽然很重要,但并不是JSON序列化的主要用例。因此,从文件实现高效的JSON加载并不是很有趣,除非在特殊情况下(有更有效的方法将大量数据结构序列化到磁盘)。在
然而,概括这个概念可能会引入一些有用的方面(例如,从网络流进行JSON反序列化,或者从管道进行渐进式JSON反序列化)。在
我们要找的是一个流式解析器(例如SAX for XML)。YAJL是一个常见的此类解析器,它有{a2}
另请参阅此问题的顶部答案:Is there a streaming API for JSON?
相关问题 更多 >
编程相关推荐