以最高效的方式重复调用Python和Java之间的交互

3

我有几个Python脚本(例如a.pyb.py),它们在顶部共享相同的开销,例如:

import matplotlib.pylab as plt
#and some Oracle database connection and reading.

然后我有一个JavaScript,使用Runtime调用这几个Python脚本:

Process p = Runtime.getRuntime().exec("python a.py");
p.waitFor();
...
p = Runtime.getRuntime().exec("python b.py");
p.waitFor();

我在每次调用Python时都遇到了Java Runtime和Python导入开销,这给我带来了反复的开销。我想知道是否有一种方法可以在第一次Python调用期间仅涉及一次开销(也许通过传递某些Python处理程序/状态?)。我也愿意尝试第三方工具(例如Jython)。

3个回答

3

不确定这是否会加速您的程序,但一个选项是使用Jython启动一个Python解释器一次,然后为多个脚本重复使用它。您只需要添加对Jython JAR的依赖项(在http://www.jython.org/downloads.html下载或使用Maven / Gradle等)。

import org.python.util.PythonInterpreter;
public class JythonTest {
    public static void main(String[] args) {
        PythonInterpreter pythonInterpreter = new PythonInterpreter();
        pythonInterpreter.execfile("a.py");
        pythonInterpreter.execfile("b.py");
    }
}

Ref: http://tssblog.blogs.techtarget.com/2007/11/21/using-python-within-java/ 本文介绍了如何在Java中使用Python。通过使用Jython,可以在Java程序中嵌入Python代码并实现Java和Python的互操作性。此外,还讨论了如何从Java调用Python函数,并演示了一个简单的示例。

2

不要单独启动每个程序并运行到完成,创建一个“启动器”从标准输入读取,并与该启动器交互-这应该是一个程序,直到被告知退出才会退出;其整个目的是启动其他功能。

然后将其视为资源,并使用它来调用各个函数并返回结果(而不是Java的Process)。

对于许多具有共享依赖关系的不同类型的外部程序,可以使用相同的策略-启动器可以一次加载共同的依赖项/自己的运行时,并更快地调用这些依赖项中的函数。


当您说“启动器”时,您是指某个逻辑模型还是某个Java工具/API(例如http://www.syncedit.com/software/javalauncher/)? - Hailiang Zhang
我只是在指称一个逻辑模型,并非具体的实现。你可以使用std-in来实现它,或者通过读取套接字/RPC等方式来实现,根据情况和技术选择最合适的方式即可。 - Krease

1
你可以启动Python脚本一次,然后通过某种IPC(进程间通信)与它进行重复任务的通信。一些想到的方法包括:
  • 通过Python进程托管的HTTP API访问(Java进程作为客户端)
  • 如果使用OS X/Linux,则使用信号
  • 简单地通过文件传递指令,但可能需要实现文件锁定(以防止读者在写入者未完成时读取不完整的文件)

然而,实现这些中的任何一个都感觉有点像过早优化。为什么不先实现最简单的方式(就像你的示例),并分析CPU使用情况。很有可能,你当前的方法不会像你想象的那样对CPU使用造成太大影响。


我进行了CPU分析,确实存在开销。 - Hailiang Zhang

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