为啥 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 文件上花费了这么多时间?的主要内容,如果未能解决你的问题,请参考以下文章