在 Jython 中调用 xml.sax.make_parser() 非常慢 - 如何加快速度?

Calling xml.sax.make_parser() is incredibly slow in Jython - how do I speed it up?

我在 Java 应用程序中使用 jython-standalone-2.7.2.jar 并执行需要解析小 [=​​27=] 文件的简单脚本。出于某种原因,make_parser() 到 return 解析器对象几乎需要两秒钟。

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 ---

在 Jython 脚本中没有 "writing Java pseudo-code" 的情况下,是否有任何方法可以加快每个脚本 运行 的速度?

我不确定是什么占用了这么多时间 - 也许是正在执行查找?由于 make_parser() 需要一个解析器列表,为了避免查找(在 Jython 的上下文中),该列表中应该提供什么?

确实初始化解析器很慢。 Jython 在底层使用 Java Sax。创建 Java 的 Sax 实现的所有 Python 对象需要时间。

如果您有一个纯 Python 解析器,您可以将其插入 make_parser 列表。所以你可能会减少较长的启动时间,但实际解析会更慢。 - 但是我不知道 XML 解析器的纯 Python 实现。 CPython 的默认值 (xml.sax.expatreader) 使用 C 模块。

好的方面:创建解析器后,解析执行或创建辅助解析器应该会非常快。

因此,如果您需要解析各种小 XML 文件(正如您在评论中指出的那样),您可以在 Java 应用程序和此实例创建一个 make_parser Python 对象。这是一个骨架:(这是Java代码)

PythonInterpreter pi = new PythonInterpreter();

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

随后的脚本都可以使用 parser 只要您通过相同的 PythonInterpreter 实例执行它们,如下所示:(Java again)

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

your-jython-script.py 可能包含如下内容:(This is Python)

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

请注意,Python 脚本不需要 XML 导入,因为它使用预先创建的 Python 对象 parser.