为什么PyYAML在解析YAML文件时花了这么多时间?

时间:2013-08-23 13:44:33

标签: python json yaml pyyaml

我使用以下格式解析大约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

1 个答案:

答案 0 :(得分:17)

根据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