我的代码在很大程度上依赖于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个数量级呢?
谈到效率,我使用了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,导致开销增加。
我不是一个YAML解析器的实现者,所以如果没有一些分析数据和大量的示例,我就不能明确地说出数量级。无论如何,在对基准数字充满信心之前,一定要测试大量的输入。
更新哎哟,把问题看错了。:—(尽管输入语法很大,序列化仍然可以非常快;但是,浏览源代码时,它看起来像PyYAML的Python级序列化constructs a representation graph,而simplejson将内置的Python数据类型直接编码为文本块。
相关问题 更多 >
编程相关推荐