Есть ли обновленный быстрый парсер YAML с привязками python?

Каков последний и самый большой для быстрого анализа YAML в Python? Syck устарел и рекомендует использовать PyYaml, но PyYaml довольно медленный и страдает от проблемы GIL:

>>> def xit(f, x): import threading for i in xrange(x): threading.Thread(target=f).start() >>> def stressit(): start = time.time() res = yaml.load(open(path_to_11000_byte_yaml_file)) print "Took %.2fs" % (time.time() - start,) >>> xit(stressit, 1) Took 0.37s >>> xit(stressit, 2) Took 1.40s Took 1.41s >>> xit(stressit, 4) Took 2.98s Took 2.98s Took 2.99s Took 3.00s 

Учитывая мой вариант использования, я могу кэшировать проанализированные объекты, но я бы предпочел бы более быстрое решение даже для этого.

One Solution collect form web for “Есть ли обновленный быстрый парсер YAML с привязками python?”

Связанная страница wiki указывает после предупреждения «Использовать libyaml (c) и PyYaml (python)». Хотя заметка имеет плохой wikiilink (должен быть PyYAML не PyYaml ).

Что касается производительности, в зависимости от того, как вы установили PyYAML, у вас должен быть класс CParser, который реализует YAML-парсер, написанный оптимизированным C. Хотя я не думаю, что это обострило проблему GIL, это заметно быстрее. Вот несколько бегущих тестов, которые я запускал на своей машине (AMD Athlon II X4 640, 3.0 ГГц, 8 ГБ ОЗУ):

Сначала с помощью парсера pure-Python по умолчанию:

 $ /usr/bin/python2 -m timeit -s 'import yaml; y=file("large.yaml", "r").read()' \ 'yaml.load(y)' 10 loops, best of 3: 405 msec per loop 

С помощью CParser:

 $ /usr/bin/python2 -m timeit -s 'import yaml; y=file("large.yaml", "r").read()' \ 'yaml.load(y, Loader=yaml.CLoader)' 10 loops, best of 3: 59.2 msec per loop 

И, для сравнения, с PyPy с использованием анализатора pure-Python.

 $ pypy -m timeit -s 'import yaml; y=file("large.yaml", "r").read()' \ 'yaml.load(y)' 10 loops, best of 3: 101 msec per loop 

Для large.yaml я просто large.yaml «большой файл yaml» и наткнулся на это:

https://gist.github.com/nrh/667383/raw/1b3ba75c939f2886f63291528df89418621548fd/large.yaml

(Мне пришлось удалить первые пару строк, чтобы сделать его одним документом YAML, иначе yaml.load жалуется.)

РЕДАКТИРОВАТЬ:

Другое дело – использовать модуль multiprocessing вместо потоков. Это касается проблем GIL, но для связи между процессами требуется немного больше кода котельной. Есть несколько хороших библиотек, доступных для облегчения многопроцессорности. Здесь их довольно неплохой список.

  • Разбор YAML и Python?
  • Как получить список dict вместо использования collection.defaultdict в python
  • Переносимые переменные записи в файл YAML
  • python yaml.dump плохой отступ
  • Загрузка документа в качестве исходной строки в yaml с помощью PyYAML
  • Обслуживание статического html в Google app engine Python
  • Отключить преобразование значения PyYAML
  • Python и PYAML - yaml.scanner.ScannerError: значения отображения здесь не допускаются
  • Python - лучший язык программирования в мире.