为啥 PyYAML 仅仅在解析 YAML 文件上花费了这么多时间?

Posted

技术标签:

【中文标题】为啥 PyYAML 仅仅在解析 YAML 文件上花费了这么多时间?【英文标题】:Why is PyYAML spending so much time in just parsing a YAML File?为什么 PyYAML 仅仅在解析 YAML 文件上花费了这么多时间? 【发布时间】:2013-08-26 14:24:17 【问题描述】:

我正在解析一个大约 6500 行的 YAML 文件,格式如下:

foo1:
  bar1:
    blah:  name: "john", age: 123 
  metadata:  whatever1: "whatever", whatever2: "whatever" 
  stuff:
    thing1: 
      bluh1:  name: "Doe1", age: 123 
      bluh2:  name: "Doe2", age: 123 
    thing2:
    ...
    thingN:
foo2:
...
fooN:

我只想用PyYAML library 解析它(我认为在Python 中没有其他替代方法:How can I parse a YAML file in Python)。

只是为了测试,我编写了代码来解析我的文件:

import yaml

config_file = "/path/to/file.yaml"

stream = open(config_file, "r")
sensors = yaml.load(stream)

使用time 命令连同我这次得到的脚本一起执行脚本:

real    0m3.906s
user    0m3.672s
sys     0m0.100s

这些价​​值观似乎真的不太好。我只是想用 JSON 进行相同的测试,只是先将相同的 YAML 文件转换为 JSON:

import json

config_file = "/path/to/file.json"

stream = open(config_file, "r")
sensors = json.load(stream)  # We read the yaml config file

但执行时间要好得多:

real    0m0.058s
user    0m0.032s
sys     0m0.008s

为什么 PyYAML 解析 YAML 文件比解析 JSON 文件花费更多时间的主要原因? 是 PyYAML 的问题还是因为 YAML 格式难以解析? (可能是第一个)

编辑:

我添加了另一个使用 ruby​​ 和 YAML 的示例:

require 'yaml'

sensors = YAML.load_file('/path/to/file.yaml')

而且执行时间很好! (或者至少没有 PyYAML 示例那么糟糕):

real    0m0.278s
user    0m0.240s
sys     0m0.032s

【问题讨论】:

类似问题 => ***.com/questions/2451732/… @moliware 是的,我以前读过那个。但是问题是关于序列化的,答案似乎没有回答我的问题:( 经过您的编辑,我明白了。您是否使用正确的选项安装它: $ python setup.py --with-libyaml install 是的,我按照这里的说明进行操作:rmcgibbo.github.io/blog/2013/05/23/… 但 LibYAML 没有任何改进。 您能否发布您正在使用的 yaml 和 json 数据文件的链接。我想比较两者,看看时间都花在了哪里。 【参考方案1】:

根据the docs,您必须使用CLoader/CSafeLoader(和CDumper):

import yaml
try:
    from yaml import CLoader as Loader
except ImportError:
    from yaml import Loader

config_file = "test.yaml"

stream = open(config_file, "r")
sensors = yaml.load(stream, Loader=Loader)

这给了我

real    0m0.503s

而不是

real    0m2.714s

【讨论】:

以上是关于为啥 PyYAML 仅仅在解析 YAML 文件上花费了这么多时间?的主要内容,如果未能解决你的问题,请参考以下文章

如果有“!”,如何使用 PyYAML 解析 YAML在 YAML 中

pyyaml “有序”解析/生成yaml

Python的PyYAML模块详解

PyYaml 结合两个 yaml 文件

在 PyYAML 中保存/转储带有注释的 YAML 文件

Python + PyYAML 读取yaml配置文件数据