与独立的Python脚本相比,为什么Jython需要更多的执行时间

时间:2012-06-27 07:55:40

标签: python performance python-2.7 jython

我刚刚开始使用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;
   }
   }

1 个答案:

答案 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可执行文件...(不确定您的要求是否已经考虑过)。