一尘不染

JSON序列化比Python中的yaml序列化快得多吗?

json

我的代码在很大程度上依赖yaml进行跨语言序列化,并且在加速某些工作时,我注意到yaml与其他序列化方法(例如pickle,json)相比非常慢。

所以真正令我震惊的是,当输出几乎相同时,json的速度要比Yaml快得多。

>>> import yaml, cjson; d={'foo': {'bar': 1}}
>>> yaml.dump(d, Dumper=yaml.SafeDumper)
'foo: {bar: 1}\n'
>>> cjson.encode(d)
'{"foo": {"bar": 1}}'
>>> import yaml, cjson;
>>> timeit("yaml.dump(d, Dumper=yaml.SafeDumper)", setup="import yaml; d={'foo': {'bar': 1}}", number=10000)
44.506911039352417
>>> timeit("yaml.dump(d, Dumper=yaml.CSafeDumper)", setup="import yaml; d={'foo': {'bar': 1}}", number=10000)
16.852826118469238
>>> timeit("cjson.encode(d)", setup="import cjson; d={'foo': {'bar': 1}}", number=10000)
0.073784112930297852

PyYaml的CSafeDumper和cjson都是用C编写的,因此这并不是C与Python的速度问题。我什至还添加了一些随机数据,以查看cjson是否正在执行任何缓存,但是它仍然比PyYaml快得多。我意识到yaml是json的超集,但是使用这样简单的输入,yaml序列化器怎么会慢2个数量级呢?


阅读 288

收藏
2020-07-27

共1个答案

一尘不染

通常,决定解析速度的不是输出的复杂性,而是接受的输入的复杂性。JSON语法非常简洁。YAML解析器相对复杂,导致开销增加。

JSON的首要设计目标是简单性和通用性。因此,JSON的生成和解析非常简单,但代价是人类可读性降低。它还使用最低公分母信息模型,以确保每个现代编程环境都可以轻松处理任何JSON数据。

相反,YAML的首要设计目标是人类可读性并支持序列化任意本机数据结构。因此,YAML允许可读性极强的文件,但生成和解析更加复杂。此外,YAML的业务范围超出​​了最低公分母数据类型,因此在不同的编程环境之间进行转换时,需要进行更复杂的处理。

我不是YAML解析器实现者,因此如果没有一些性能分析数据和大量示例集,我就无法具体说明数量级。无论如何,在对基准数字充满信心之前,请务必对大量输入进行测试。

更新“
糟糕”,误解了问题。:-(尽管输入语法很大,但是序列化仍然可以非常快;但是,浏览源代码,看起来PyYAML的Python级序列化构造了一个表示图,而simplejson将内置的Python数据类型直接编码为文本块。

2020-07-27