我刚刚开始使用4周前的Python / Jython。jython脚本的执行时间问题比独立的同一个python脚本要多14倍。根据我的项目要求,我们需要集成python / Jython脚本使用Java应用程序。根据Jython doc,我创建了JythonFacory类来调用jython脚本并获得脚本结果。但是当我看到执行时间(59秒)这是一个很大的性能问题。当我在eclipse中运行相同的独立python脚本时,它非常快(约3秒)。
你能否告诉我应该怎样做以获得更好的表现。由于性能问题,看起来Jython对我来说不是一个好选择。有没有其他选项可以直接从java调用纯Python脚本而不使用Jython.jar
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;
}
}
答案 0 :(得分:1)
嗯,我认为这些结果是可以预期的... Jython是在Java上解释Python代码,我认为它目前不是优化使用Java 7上可用的更快的方法调度(invokeDynamic):请参阅:https://us.pycon.org/2012/schedule/presentation/446/(即便如此,目前还不清楚它是否比CPython更快)。
但是,如果你为Java编写和调整它(例如:可能优化所需的热点,将它们转换为Java),你可能会在你的程序上获得更好的性能 - 在CPython上也可以这样做,你可能会翻译它到C / C ++)。
您可以尝试在Java中使用CPython(请参阅:http://jepp.sourceforge.net/)或直接调用Python可执行文件...(不确定您的要求是否已经考虑过)。