Почему PyYAML тратит так много времени только на анализ файла YAML?

Я анализирую файл YAML с около 6500 строк в следующем формате:

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:Как я могу разобрать файл YAML в 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
 moliware23 авг. 2013 г., 16:19
Подобный вопрос =>stackoverflow.com/questions/2451732/...
 moliware23 авг. 2013 г., 16:40
После вашего редактирования я понимаю. Вы установили его с соответствующей опцией: $ python setup.py --with-libyaml install
 Pigueiras23 авг. 2013 г., 16:43
Да, я следовал инструкциям здесь:rmcgibbo.github.io/blog/2013/05/23/... но LibYAML ничего не улучшил.
 Marwan Alsabbagh23 авг. 2013 г., 19:24
Можете ли вы опубликовать ссылку на файлы данных yaml и json, которые вы используете. Я хочу сравнить два и посмотреть, где время тратится.
 Pigueiras23 авг. 2013 г., 16:35
@moliware Да, я читал это раньше. Но вопрос был о сериализации, и ответы, похоже, не отвечают на мой вопрос :(

Ответы на вопрос(1)

Решение Вопроса

Согласно сдокументы вы должны использовать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

Ваш ответ на вопрос