gpt4 book ai didi

Python:自定义JSON解码器的性能

转载 作者:太空狗 更新时间:2023-10-30 01:23:31 25 4
gpt4 key购买 nike

我有一个应用程序,它使用标准的 JSON 工具定期将 JSON 文件转储并加载到 Python 中。

早些时候,我们认为将加载的 JSON 数据作为对象而不是字典来处理要方便得多。这实际上归结为“点”成员访问的便利性,而不是用于字典键查找的 [] 符号。 Javascript 的优点之一是字典查找和成员数据访问之间没有真正的区别(我猜这就是 JSON 特别适合 Javascript 的原因)。但在 Python 中,字典键和对象数据成员是不同的东西。

因此,我们的解决方案是仅使用自定义 JSON 解码器,该解码器使用 object_hook 函数返回对象而不是字典。

我们从此过上了幸福的生活……直到现在,这个设计决定可能会被证明是个错误。你看,现在 JSON 转储文件已经变得相当大(> 400 MB)。据我所知,标准的 Python 3 JSON 工具使用 native 代码来进行实际的解析,因此它们非常快。但是,如果您提供自定义 object_hook,它仍然必须为每个解码的 JSON 对象执行解释的字节代码 - 这会严重减慢速度。如果没有 object_hook,解码整个 400 MB 文件只需要大约 20 秒。但是有了钩子(Hook),需要半个多小时!

因此,在这一点上,我想到了 2 个选项,但都不是很令人愉快。一种是忘记使用“点”成员数据访问的便利性,而只使用 Python 字典。 (这意味着要更改大量代码。)另一种方法是编写一个 C 扩展模块并将其用作 object_hook,看看我们是否获得任何加速。

我想知道是否有一些我没有想到的更好的解决方案 - 也许是一种更简单的方法来获得“点”成员访问权限,同时仍然最初解码为 Python 字典。

对这个问题有什么建议和解决办法吗?

最佳答案

您可以尝试不使用 object_hook,让 json 返回一个字典,然后将该字典转储到一个命名元组中。

像这样:

from collections import namedtuple
result = json.parse(data)
JsonData = namedtuple("JsonData", result.keys())
jsondata = JsonData(**result)

我不知道那会是什么速度,但值得一试。

关于Python:自定义JSON解码器的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12411395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com