3

我对 Python/Jython 非常陌生,刚开始 4 周。与独立的相同 python 脚本相比,jython 脚本的执行时间要多 14 倍。根据我的项目要求,我们需要将 python/Jython 脚本与 Java 应用程序集成. 根据 Jython 文档,我创建了 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;
   }
   }
4

1 回答 1

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 可执行文件...(不确定您的要求)。

于 2012-07-07T22:34:49.233 回答