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

3

我对Python / Jython非常陌生,仅在4周前开始学习。 问题出在执行Jython脚本的时间上,它比独立的Python脚本花费了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;
   }
   }

1
如果你使用 jython yourscript.py 运行它,你会得到什么时间? - jfs
@J.F.Sebastian:这个问题有点难以理解。但他看到Jython需要一分钟,而Cython只需要三秒钟。 - Bill Lynch
1
@sharth:Java代码表明未使用jython脚本,即一分钟不是指jython yourscript.py(尽管结果可能相同)。此外,Cython与CPython(用C实现的Python参考实现)不同。 - jfs
@J.F.Sebastian:这是两个非常好的观点,你完全正确。 - Bill Lynch
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 可执行文件...(不确定您的要求如何)。


不期望有20倍的差异(由于问题中没有Python代码,因此很难说)。 - jfs
感谢大家宝贵的意见。但不幸的是,我们的Java应用程序使用1.6_24版本。因此,为了解决问题,我使用Python wsgiref模块实现了一个基于REST的Web服务,并在其中执行独立的Python脚本。这比使用Jython脚本表现更佳。 - Utpal Sarkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接