2016-01-19 26 views
2

我有幾個Python腳本(如a.pyb.py),其在頂部共享相同的開銷,例如:反覆從Java調用蟒蛇以最有效的方式

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

然後,我有一個Java腳本,用戶運行時調用這幾個Python腳本分開:

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

我從重複開銷遭受由於每個蟒蛇在通話過程中的Java運行時和蟒蛇進口開銷。我想知道在第一次python調用期間是否有一種方法只涉及一次性開銷(通過傳遞一些python處理程序/狀態也許?)我也開放給第三方工具(例如Jython)。

回答

1

不是單獨啓動每個程序並運行完成,而是創建一個從標準輸入中讀取並與該啓動程序交互的「啓動程序」 - 這應該是一個程序,在程序被告知之前不會退出;其全部目的是啓動其他功能。

然後將其視爲資源並用它來調用各個函數並返回結果(而不是Java的Process)。

對於具有共享依賴關係的許多不同類型的外部程序,可以使用相同的策略 - 啓動程序可以加載公共依賴關係/它自己的運行時,並且可以更快速地調用這些依賴關係中的函數。

+0

當你說「啓動器」時,你的意思是一些邏輯模型或一些Java工具/ API(例如http://www.syncedit.com/software/javalauncher/)? –

+0

我只是指的是一個邏輯模型,而不是一個具體的實現。你可以用std-in,或者從套接字/ RPC中讀取,或者根據你擁有的情況和技術來實現它。 – Krease

1

您可以啓動一次Python腳本,然後通過某種IPC(進程間通信)與它交流重複的任務。浮現在腦海中的一些方法:

通過如果使用OS X/Linux的使用 signals
  • 東西作爲交付指令那樣簡單由Python進程(Java進程作爲客戶端)
  • 主辦的HTTP API
    • 訪問通過文件 - 雖然你可能需要實現文件鎖定(所以如果作者還沒有完成,讀者不會讀取不完整的文件)

    但是,實現這些中的任何一個都會感覺有點像早熟優化。爲什麼不首先實現最簡單的方法(如你的例子),並分析你的CPU使用情況。很有可能,目前的方法不會像你可能懷疑的那樣影響CPU使用率。

  • +0

    我做了CPU剖析和開銷確實存在。 –

    1

    不知道這是否會加速您的程序,但有一個選擇是使用Jython啓動一次Python解釋器,然後將其重複用於多個腳本。你只需要添加Jython的JAR的依賴(下載在http://www.jython.org/downloads.html或使用Maven /搖籃/等)

    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/