PyPy медленнее чем CPython с переводчиком файлов - PullRequest
0 голосов
/ 21 января 2019

У меня есть переводчик в Python (на основе, в результате, похожий на Heat-Translator [1]). Это работает немного медленно. Поэтому я обратился к PyPy. После перехода на него я обнаружил, что на самом деле он немного медленнее.

Таким образом, проект принимает файл YAML, анализирует его, преобразует дерево памяти и выплевывает файл в другом формате, немного похожем на компилятор.

Подходит ли PyPy для этого типа использования? Я думал, что он был разработан для задач, связанных с процессором.

  1. https://github.com/openstack/heat-translator

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Если бы вы могли создать эталон, отражающий вашу рабочую нагрузку, вы могли бы отправить его как проблему в PyPy https://bitbucket.org/pypy/pypy/issues и как PR в набор тестов python https://github.com/python/performance

0 голосов
/ 21 января 2019

Не видя, какую библиотеку YAML вы используете (PyYAML, ruamel.yaml) и ваш реальный код, это невозможно объяснить окончательно. Однако, например, если вы используете стандартную процедуру загрузки:

from ruamel.yaml import YAML

yaml = YAML(typ='safe')
with open('somefile.yaml') as fp:
    yaml.load(fp)

для загрузки документа YAML 1.2 (или 1.1) из файла. На самом деле вы будете использовать считыватель / сканер, написанный на C, если вы запустите его с использованием CPython, и будете запускать чистую версию Python при запуске с использованием PyPy.

В зависимости от файла считыватель / сканер, основанный на C, дает повышение скорости загрузки на один-два порядка по сравнению с чистой реализацией Python, поэтому я не удивляюсь, что это не может сравниться с PyPy, компилирующей Python.

В прошлом я кратко рассматривал использование сканера / сканера на основе C при использовании PyPy, но это не казалось тривиальным, и поскольку этот сканер / сканер с кодировкой C устарел и нуждается в обновлении, этот план был заморожен. .

При использовании PyYAML (для устаревших документов YAML 1.1) действует аналогичный принцип, хотя он не будет автоматически использовать этап чтения / сканирования на основе C, если это явно не указано иным образом.

...