簡體   English   中英

在python中重復運行相同的java函數的最佳方法是什么?

[英]What is the best way to run the same java function repeatedly in python?

我正在做一個項目,要求我在python中反復運行Java函數(就像在python中設計學習算法,但value函數是在Java中提供的)

那么這種情況下的做法是什么? 我應該每次都使用subprocess.run()來調用java函數嗎?還是應該使用Py4J,Jython或JPype之類的東西? 使用subprocess.run()與其他方法有什么區別?

由於我需要重復運行相同的 java函數,因此效率應該是首要考慮的問題。

  • 使用subprocess有兩個問題。 如果兩者都不相關,它將正常工作。
    • 如果要來回發送大量數據,則必須以某種格式對其進行序列化,以通過文件和命令行參數或管道或套接字傳遞,這可能很慢。
    • 如果您要調用很多短函數而不是偶爾調用一個大函數,那么與實際工作相比,您將花費更多的時間來設置和拆除JVM(並預熱JIT)。
  • Jython有兩個問題。 同樣,如果沒有人影響您,它將正常運行。
    • 它不能使用許多流行的第三方庫,因為它們是C語言內置的,用於CPython。
    • 已經過時了 最新版本實現了Python 2.7,距支持不到2年的時間。
  • JPype有一個問題,但這很笨拙。 如果當前的分叉能夠滿足您的需求,並且沒有任何可阻擋您的錯誤,那么也許還可以。
    • 這是一個十多年前放棄的汽缸項目。 幾年前,它被其他人拾起並變形,目前的維護者正在使其運行,並且偶爾會獲得修補程序,例如在64位cygwin中工作或更新至OS X 10.9,但並非完全如此。充滿活力的項目,背后有重要的支持。
  • Py4J有兩個問題。
    • 還不完整 不是沒有用,也不是完全垂死,但是一年多來沒有任何可見的工作,除了Apache Spark所需的最小功能之外,似乎沒有人對它感興趣。
    • 它正在執行與您在背后的subprocess相同的序列化,並且在您進行的每個調用之后都執行更多的序列化,並且FAQ通過說性能不是優先事項來證明這一點。 (Spark只是忽略了所有這些,而是​​使用自己的通道來處理所有事情。)
    • 為了減少使用量(只需啟動JVM並為其設置套接字),它可能比subprocess要好,因為您不必一直啟動和拆除JVM,但是在兩側編寫套接字協議都需要一點時間比在命令行上存儲文件和傳遞文件名要多做一些工作。 (這不是一個很大的障礙,但如果您以前從未做過這種事情,那就是一個問題。)
  • 您可能還想看看轉譯器。 我對它們都不了解,但是我已經與使用BeeWare將Python 3.4代碼編譯為Java源代碼,然后將其與本機Java代碼一起構建的人們進行了交談。 我很確定如果您使用任何C擴展名,這都行不通,但是,如果這對您來說不是問題,那么可能值得考慮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM