【问题标题】:Calling xml.sax.make_parser() is incredibly slow in Jython - how do I speed it up?在 Jython 中调用 xml.sax.make_parser() 非常慢 - 我如何加快速度?
【发布时间】:2020-06-17 12:36:34
【问题描述】:

我在 Java 应用程序中使用 jython-standalone-2.7.2.jar 并执行需要解析一个小的 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 ---

是否有任何方法可以加快每个脚本运行的速度,而无需在 Jython 脚本中“编写 Java 伪代码”?

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

【问题讨论】:

    标签: java jython jython-2.7


    【解决方案1】:

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

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

    好的一面:一旦创建解析器,解析执行或创建辅助解析器应该很快。

    因此,如果您需要解析各种小型 XML 文件(正如您在评论中指出的那样),您可以在 Java 应用程序中创建一个全局 PythonInterpreter 实例,并在此实例中创建一个 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

    【讨论】:

    • 不幸的是,Java 应用程序的目的是允许运行短期脚本、各种应用程序插件,其中大部分都需要 XML 解析。我想我别无选择,只能尝试鼓励用户直接在 Jython 代码中使用 Java 类。那要快几个数量级。有 CPython 兼容性...
    • @predi 在这种情况下,您可以使用全局 PythonInterpreter。请参阅我的更新答案。
    • 感谢您进一步尝试,但脚本可以并行执行,每个都在一个专用线程中。我非常怀疑PythonInterpreter 是否会很乐意同时在多个线程中使用。
    • 是的。没关系。也许别人觉得它有用。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多