我是 Python/Jython 的新手,刚开始 4 周前。jython 脚本的执行时间问题与独立的相同 python 脚本相比需要多 14 倍。根据我的项目要求,我们需要集成 python/Jython 脚本与 Java 应用程序。根据 Jython 文档,我创建了 JythonFacory 类来调用 jython 脚本并获得脚本结果。但是当我看到执行时间(59 秒)时,这是一个很大的性能问题。当我在 eclipse 中运行相同的独立 python 脚本时,它非常快(大约 3 秒)。
能否请您建议我应该怎么做才能获得更好的性能。由于性能问题,看起来 Jython 对我来说不是一个好的选择。是否有任何其他选项可以在不使用 Jython.jar 的情况下直接从 Java 调用纯 Python 脚本
public class JythonFactory {
private static JythonFactory instance = null;
public synchronized static JythonFactory getInstance() {
if(instance == null){
instance = new JythonFactory();
}
return instance;
}
public static Object getJythonObject(String interfaceName,Map<String, Object>
requestTable, String pathToJythonModule) {
Object javaInt = null;
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.set("REQUEST_TABLE", requestTable);
interpreter.execfile(pathToJythonModule);
String tempName = pathToJythonModule.substring(pathToJythonModule.lastIndexOf("/")+1);
tempName = tempName.substring(0, tempName.indexOf("."));
//System.out.println(tempName);
String instanceName = tempName.toLowerCase();
String javaClassName = tempName.substring(0,1).toUpperCase() + tempName.substring(1);
String objectDef = "=" + javaClassName + "()";
//System.out.println("instanceName"+instanceName + " objectDef"+objectDef);
interpreter.exec(instanceName + objectDef);
try {
Class JavaInterface = Class.forName(interfaceName);
javaInt = interpreter.get(instanceName).__tojava__(JavaInterface);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return javaInt;
}
}
请您参考如下方法:
好吧,我认为这些结果是意料之中的……Jython 正在 Java 之上解释 Python 代码,我认为它目前没有针对使用 Java 7 上可用的更快方法分派(dispatch)(invokeDynamic)进行优化:请参阅: https://us.pycon.org/2012/schedule/presentation/446/ (即便如此,也不清楚它是否会比 CPython 更快)。
不过,如果您针对 Java 进行分析和调整,您的程序可能会获得更好的性能(即:可能优化所需的热点,将其转换为 Java——在 CPython 上也是如此,您可能会在其中进行翻译到 C/C++)。
您可以尝试在 Java 中使用 CPython(参见:http://jepp.sourceforge.net/)或直接调用 Python 可执行文件...(不确定您的需求)。
