Почему 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)

Выполняя команду script с помощью команды time вместе с script, я получаю это время:

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 трудно разбирать? (возможно, первый)

EDIT:

Я добавляю еще один пример с ruby ​​и YAML:

require 'yaml'

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

И время исполнения хорошее! (или, по крайней мере, не так плохо, как пример PyYAML):

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

Ответ 1

В соответствии с docs вы должны использовать CLoader/CSafeLoaderCDumper):

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