以最有效的方式从Java反复调用python

时间:2016-01-19 02:08:40

标签: java python jython

我有几个python脚本(例如Level1ZombieClassObject.ZombieLevel1Class(playerClass); a.py)在顶部共享相同的开销,例如:

b.py

然后我有一个java脚本,用户运行时分别调用这几个python脚本:

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

由于每次python调用期间的java Runtime和python导入开销,我都会遇到重复的开销。我想知道是否有一种方法在第一次python调用期间只涉及一次开销(通过传递一些python处理程序/状态可能?)我也对第三方工具(例如Jython)开放。

3 个答案:

答案 0 :(得分:2)

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

然后将其视为资源并使用它来调用各个函数并返回结果(而不是Java的var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'), cellSize = 50, pic = new Image(), map = [ [{x:5,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], [{x:3,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1},{x:1,y:1}], [{x:4,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1},{x:2,y:1}] ]; var scaleFix=1.02; canvas.width = 16 * cellSize; canvas.height = 16 * cellSize; ctx.setTransform(1.00, -0.5, 1.00, 0.5, 0, 200); pic.src = 'http://promodesign.kei.pl/cb/test/sprite.svg'; pic.onload = function() { for (var j = 0 ; j < 8; j ++) for (var i = 0; i < 8; i ++) ctx.drawImage(pic, (map[i][j].x-1)*cellSize, (map[i][j].y-1)*cellSize, 50, 50, j*cellSize, i*cellSize, 50*scaleFix, 50*scaleFix); var pic2 = new Image(); pic2.src = 'http://promodesign.kei.pl/cb/test/man.png'; pic2.onload = function() { ctx.setTransform(1, 0, 0, 1, 0, 60); ctx.drawImage(pic2, 150*scaleFix, 75*scaleFix); } })。

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

答案 1 :(得分:1)

您可以启动一次Python脚本,然后通过某种IPC(进程间通信)与它进行重复任务。想到的一些方法:

  • 通过Python流程托管的HTTP API进行访问(Java流程作为客户端)
  • 如果使用OS X / Linux,请使用signals
  • 像通过文件传递指令一样简单 - 虽然您可能需要实现文件锁定(因此如果编写器尚未完成,读者不会读取不完整的文件)

然而,实施其中任何一项确实有点像过早优化。为什么不首先实现最简单的方法(如在您的示例中),并分析您的CPU使用情况。有可能,您当前的方法不会像您可能怀疑的那样削减CPU使用率。

答案 2 :(得分:1)

不确定这是否会加速您的程序,但一种选择是使用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");
    }
}

参考:http://tssblog.blogs.techtarget.com/2007/11/21/using-python-within-java/

相关问题