我的代码在很大程度上依赖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个数量级呢?
通常,决定解析速度的不是输出的复杂性,而是接受的输入的复杂性。JSON语法非常简洁。YAML解析器相对复杂,导致开销增加。
JSON的首要设计目标是简单性和通用性。因此,JSON的生成和解析非常简单,但代价是人类可读性降低。它还使用最低公分母信息模型,以确保每个现代编程环境都可以轻松处理任何JSON数据。
相反,YAML的首要设计目标是人类可读性并支持序列化任意本机数据结构。因此,YAML允许可读性极强的文件,但生成和解析更加复杂。此外,YAML的业务范围超出了最低公分母数据类型,因此在不同的编程环境之间进行转换时,需要进行更复杂的处理。
我不是YAML解析器实现者,因此如果没有一些性能分析数据和大量示例集,我就无法具体说明数量级。无论如何,在对基准数字充满信心之前,请务必对大量输入进行测试。
更新“
糟糕”,误解了问题。:-(尽管输入语法很大,但是序列化仍然可以非常快;但是,浏览源代码,看起来PyYAML的Python级序列化构造了一个表示图,而simplejson将内置的Python数据类型直接编码为文本块。
我试图从python向json文件发送一个简单的字典,但我一直收到“TypeError:1425不是json可序列化的”消息。 如果我添加默认参数,那么它会写入,但整数值会作为字符串写入json文件,这是不可取的。
问题内容: 既然没有,可以使用什么本机实现来处理呢? 我注意到了,并且可以使用此格式将数据格式化为JSON,但是如何反序列化? 或者,也许我缺少某些依赖项? 问题答案: 您可以使用,它的依赖项是的依赖项。因此,您无需在project.json中添加依赖项。 请注意,使用WebAPI控制器,您无需处理JSON。 更新ASP.Net Core 3.0 Json.NET已从ASP.NET Core 3.
由于没有,可以使用什么本机实现来处理这个问题? 我注意到,我可以用它格式化数据到JSON,但是我如何反序列化? 或者我在?
问题内容: 我在Web API项目中使用了Dictionary,该项目的序列化方式类似于JSON: 因为我有重复的键,所以我不能再使用Dictionary类型,而现在我正在使用 但这是以这种方式序列化的: 有没有办法像字典一样进行序列化? 谢谢。 问题答案: 如果您使用Newtonsoft Json.NET库,则可以执行以下操作。 定义一个转换器,以所需的方式写入键/值对的列表: 然后使用转换器:
Json序列化和Jdk序列化在存储、效率上的对比? 在之前学习Redis时,我了解的是Json序列化比原生Jdk更高效,占用空间更小,所以无脑选择Json序列化。 但是最近我在看Pig开源框架中Oauth2的时候,发现存入Token令牌居然是用的Jdk序列化方式,我很疑惑,于是自己再用Json的方式去存,看看到底会有什么区别。 结果发现Json方式占用空间比Jdk的大了很多(Jdk为17)。 我又
问题内容: 我正在尝试将本地对象序列化为json,但msdn文档似乎总是让我感到困惑。我相信我应该使用DataContractJsonSerializer,但不能完全确定,因为我看到了混合的响应。我也有人推荐Newtonsoft。 有没有人有任何经验可以指引我正确的方向? 问题答案: 您可以使用JavaScriptSerializer。 http://msdn.microsoft.com/zh-