为什么json序列化比Python中的yaml序列化快得多?

2024-04-27 07:26:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以真正让我吃惊的是,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个数量级呢?


Tags: importjsonyamlnumber序列化foosetupbar
3条回答

谈到效率,我使用了YAML一段时间,并对某些名称/值赋值在这种语言中的简单性感兴趣。然而,在这个过程中,我经常会被YAML的一个技巧所绊倒,语法上的微妙变化使你可以用更简洁的风格来写特殊的案例等等。最后,尽管YAML的语法在形式上几乎是一致的,但它给我留下了某种“模糊”的感觉。然后,我限制自己不接触现有的、正在工作的YAML代码,并以更全面、更安全的语法编写所有新的东西,这使我放弃了所有YAML。结果是YAML试图看起来像一个W3C标准,并生成一个小的关于其概念和规则的难读文献库。

我觉得,这远远超出了需要的智力开销。看看SGML/XML:由IBM在60年代开发的,由ISO标准化的,被称为HTML(以一种简化和修改的形式),它面向数以百万计的人,在全世界再次被记录和记录。上来杀了那条龙。JSON怎么能在这么短的时间内得到如此广泛的应用,只需要一个微不足道的网站(和一个javascript名人来支持它)?它简单明了,语法毫无疑问,学习和使用起来很容易。

XML和YAML对人类来说很难,对计算机来说也很难。JSON对人和计算机都非常友好和容易。

在我研究过的应用程序中,字符串到数字(float/int)之间的类型推断是解析yaml的最大开销,因为字符串可以不加引号地编写。因为json中的所有字符串都是引号,所以在解析字符串时没有回溯。一个很好的例子是值0000000000000000000s,直到读到它的末尾,你才能知道这个值是一个字符串。

其他的答案是正确的,但这是我在实践中发现的一个具体细节。

一般来说,决定解析速度的不是输出的复杂性,而是接受输入的复杂性。JSON语法是very concise。YAML解析器是comparatively complex,导致开销增加。

JSON’s foremost design goal is simplicity and universality. Thus, JSON is trivial to generate and parse, at the cost of reduced human readability. It also uses a lowest common denominator information model, ensuring any JSON data can be easily processed by every modern programming environment.

In contrast, YAML’s foremost design goals are human readability and support for serializing arbitrary native data structures. Thus, YAML allows for extremely readable files, but is more complex to generate and parse. In addition, YAML ventures beyond the lowest common denominator data types, requiring more complex processing when crossing between different programming environments.

我不是一个YAML解析器的实现者,所以如果没有一些分析数据和大量的示例,我就不能明确地说出数量级。无论如何,在对基准数字充满信心之前,一定要测试大量的输入。

更新哎哟,把问题看错了。:—(尽管输入语法很大,序列化仍然可以非常快;但是,浏览源代码时,它看起来像PyYAML的Python级序列化constructs a representation graph,而simplejson将内置的Python数据类型直接编码为文本块。

相关问题 更多 >