11

我正在用这种格式解析一个大约 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 库解析它(我认为在 Python 中没有更多的替代品:如何在 Python 中解析 YAML 文件)。

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

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
4

1 回答 1

22

根据文档,您必须使用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
于 2013-08-26T06:31:32.167 回答