Вызов xml .sax.make_parser () невероятно медленный в Jython - как мне его ускорить? - PullRequest
0 голосов
/ 17 июня 2020

Я использую jython-standalone-2.7.2.jar в приложении Java и выполняю простой сценарий, который должен проанализировать небольшой файл XML. По какой-то причине make_parser() возвращает объект парсера почти за две секунды.

from xml.sax import make_parser
import time

start_time = time.time()
parser = make_parser()
print("--- %s seconds ---" % (time.time() - start_time))

Выводит:

--- 1.79200005531 seconds ---

Есть ли способ ускорить это при каждом запуске скрипта без "написания Java псевдокода" в скрипте Jython?

Я не уверен, что занимает так много времени - возможно, это выполняется поиск? Поскольку make_parser() принимает список парсеров, что можно указать в этом списке, чтобы избежать поиска (в контексте Jython)?

1 Ответ

2 голосов
/ 18 июня 2020

Действительно, инициализация парсера идет медленно. Jython использует Java Sax под капотом. На создание всех Python объектов реализации Java Sax нужно время.

Если бы у вас был чистый парсер Python, вы могли бы подключить его к списку, который принимает make_parser. Таким образом, вы можете сократить длительное время запуска, но фактический анализ будет медленнее. - Однако мне неизвестна чистая реализация Python парсера XML. CPython по умолчанию (xml.sax.expatreader) использует модуль C.

С яркой стороны: После создания синтаксического анализатора выполнение синтаксического анализа или создание вторичного парсер должен быть довольно быстрым.

Поэтому, если вам нужно проанализировать различные небольшие файлы XML (как вы указываете в своем комментарии), вы можете создать глобальный экземпляр PythonInterpreter в своем приложении Java и в этом случае создайте объект make_parser Python. Здесь скелет: ( Это Java код )

PythonInterpreter pi = new PythonInterpreter();

pi.exec("from xml.sax import make_parser\n" +
        "parser = make_parser()");

Все последующие скрипты могут использовать parser, если вы выполняете их через один и тот же PythonInterpreter экземпляр. вот так: (Java снова )

pi.execfile("your-jython-script.py");

your-jython-script.py может содержать что-то вроде этого: ( Это Python)

with open('your-first-xml.xml`) as f:
    xml = parser(f)
    .
    .
    .

Обратите внимание, что сценарий Python не требует импорта XML, поскольку он использует предварительно созданный Python объект parser.

...