Есть ли обновленный быстрый парсер 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
  • Чтение YAML в python
  • принудительное сведение pyYAML
  • Могу ли я ускорить YAML?
  • Разбор файла YAML в Python и доступ к данным?
  • Как указать параметр сериализатора параметров запроса в django-rest-swagger?
  • Как использовать пользовательскую проверку подлинности с атрибутом login: required в app.yaml (движок Google для приложений, python)
  • установка url в файле yaml для google app engin (страница не найдена) проблема
  •  
    Interesting Posts for Van-Lav

    Создание ссылки на URL-адрес приложения Flask в шаблоне jinja2

    Как сделать файл приватным, закрепив URL-адрес, который могут видеть только прошедшие проверку подлинности пользователи

    Как преобразовать MultiDict в вложенный словарь

    Как использовать исходный код python в шаблоне Django?

    Почему эта программа Haskell намного медленнее, чем эквивалентная Python?

    Python Popen (). Stdout.read () зависает

    Создать PyString из массива символов c без копирования

    Ошибка API Google для quickstart.py KeyError: '_module'

    Исключение: «точка» не найдена в пути в python на mac

    Pandas: получать значения из столбца, которые отображаются больше, чем X раз

    Использование inlineCallbacks

    Обнаружение областей пузырьков диалога комиксов в изображениях

    scipy: Интерполирующая траектория

    Приложение для создания инсталляторов для Linux, Windows и MacOSX из одной конфигурации

    Предпочтительный способ определения свойств в Python: декоратор свойств или лямбда?

    Python - лучший язык программирования в мире.