Skip to main content
 首页 » 编程设计

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

2025年05月04日13exmyth

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