我有一个应用程序,它使用标准 JSON 工具定期将 JSON 文件转储并加载到 Python 中。
早期,我们认为将加载的 JSON 数据作为对象而不是字典来处理要方便得多。这实际上归结为“点”成员访问的便利性,而不是[]
字典键查找的符号。Javascript 的优点之一是字典查找和成员数据访问之间没有真正的区别(我猜这就是 JSON 特别适合 Javascript 的原因)。但在 Python 中,字典键和对象数据成员是不同的东西。
所以,我们的解决方案是只使用一个自定义 JSON 解码器,它使用一个object_hook
函数来返回对象而不是字典。
我们从此过上了幸福的生活……直到现在,这个设计决定可能被证明是一个错误。您会看到,现在 JSON 转储文件变得相当大(> 400 MB)。据我所知,标准的 Python 3 JSON 工具使用本机代码进行实际解析,因此速度非常快。但是,如果您提供 custom object_hook
,它仍然必须为每个解码的 JSON 对象执行解释的字节码 - 这严重减慢了速度。如果没有object_hook
,解码整个 400 MB 文件只需大约 20 秒。但是有了钩子,需要半个多小时!
因此,在这一点上,我想到了 2 个选项,这两个选项都不是很令人愉快。一种是忘记使用“点”成员数据访问的便利性,而只使用 Python 字典。(这意味着要更改大量代码。)另一个是编写一个 C 扩展模块并将其用作object_hook
,看看我们是否得到任何加速。
我想知道是否有一些我没有想到的更好的解决方案——也许是一种更简单的方法来获得“点”成员访问权限,同时仍然最初解码为 Python 字典。
有什么建议,解决这个问题吗?