为什么解析YAML比等效/更大量的JSON慢?

时间:2017-10-16 15:52:50

标签: python json yaml

我在两小时前推出了这段代码:

python -c "import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)" < input.yaml > output.json

我有一个450 MB的YAML文件,在这次转换中浪费的时间真的令人难以置信(实际上还在转换) 在我使用2 MB的YAML测试文件来测试代码(在互联网上找到的代码)之前。我收到了一个9 MB的转换JSON文件。这对我来说真的很奇怪(JSON需要更多空间),但更奇怪的是,打开2 MB YAML文件的python浪费的时间比打开9 MB的JSON文件要多。 当YAML文件需要2分钟时,JSON文件立即打开。 有人可以解释这些事吗? python,JSON和YAML解析器背后的魔力在哪里?

1 个答案:

答案 0 :(得分:4)

YAML比JSON复杂得多,因此在解析过程中,YAML必须进行更多检查,例如:下一个节点是否在输入时从块切换到流式。更多的努力只需要更多的时间。

因此,即使您使用CLoader加载(在YAML中您必须明确地执行,并且这是该JSON标准库的默认值),您将会变慢。

YAML文件可以更小应该是明显的,因为它不需要JSON所需的(双)引用开销。但是阅读文件不是花费时间的地方,而是解析,这对YAML来说更难。

YAML解析器(纯Python和CLoader的帮助)比JSON解析器具有更多的内存开销,分配该内存当然也是有代价的。如果加载2Mb YAML文件使用100Mb +内存,我不会感到惊讶。

对于较小的语法,优化解析器当然也更容易,YAML的CLoader肯定可以改进,但这样做需要花费很多时间。

还有一点不同,即使使用json.load(),整个文件也会被读入内存然后进行解析(load(),只需调用loads()。 YAML解析流,原则上可以处理大于内存/交换空间的文件,也有一些开销。另一方面,解析YAML会产生相当大的开销,因此大文件也会成为一个问题。