我在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 ---
有没有办法在不"编写 Java 伪代码"的情况下加快每次脚本运行的速度?
我不确定是什么占用了这么多时间 - 也许是正在执行的查找?由于make_parser()
采用解析器列表,因此在此列表中会提供什么以避免查找(在 Jython 的上下文中(?
事实上,初始化解析器很慢。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_parsern" +
"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
。