在 python 中重复 运行 相同的 java 函数的最佳方法是什么?

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

我正在做一个项目,需要我 反复 运行 python 中的 java 函数(这就像设计一个学习算法在 python 中,但值函数在 java)

中提供

那么这种情况下的做法是什么?我应该每次都使用 subprocess.run() 来调用 java 函数,还是应该使用 Py4J、Jython 或 JPype 之类的东西?使用 subprocess.run() 和其他方法有什么区别?

效率应该是最重要的,因为我需要运行相同java函数重复 .

  • 使用subprocess有两个问题。如果两者都不相关,它会正常工作。
    • 如果您要来回发送大量数据,则必须以某种格式将其序列化以通过文件和 command-line 参数、管道或套接字传入,这可能会很慢。
    • 如果您要调用一大堆短函数而不是偶尔调用一个大函数,那么与实际工作相比,您将花费更多的时间来设置和拆除 JVM(以及预热 JIT)。
  • Jython 有两个问题。同样,如果两者都不影响您,它会正常工作。
    • 它不能使用许多流行的 third-party 库,因为它们是用 C 构建的,对于 CPython。
    • 它已经过时了。最新版本实现了 Python 2.7,距离停止支持还有不到 2 年的时间。
  • JPype 有一个问题,但很麻烦。如果当前的分叉可以满足您的需求并且没有任何错误阻碍您,那么也许它还是可以的。
    • 这是一个十多年前放弃的汽件项目。它在几年前被其他人拾起并敲定了形状,目前的维护者正在保留它 运行,偶尔会为诸如在 64 位 cygwin 中工作或更新到 OS 之类的东西打补丁X 10.9,但它并不是一个有主要支持的充满活力的项目。
  • Py4J 有两个问题。
    • 不完整。不是不可用,也不是完全没用,但一年多来没有任何可见的工作,而且除了 Apache Spark 所需的最小功能之外似乎没有人对任何东西感兴趣。
    • 它正在执行您在 subprocess 背后执行的相同类型的序列化,而且对于您进行的每次调用都不止于此,常见问题解答通过说明性能不是优先事项来证明这一点。 (Spark 忽略了所有这些,并使用自己的渠道处理所有事情。)
    • 对于最低限度的使用——只需启动一个 JVM 并为其设置一个套接字——它可能比 subprocess 更好,因为你不必继续启动和拆除 JVM,但是写双方的套接字协议比在命令行上存储文件和传递文件名要多一些工作。 (这不是一个很大的障碍,但如果你以前从未做过这种事情,那就是个问题。)
  • 您可能还想看看转译器。我对他们中的任何一个都不太了解,但我已经与使用 BeeWare 将 Python 3.4 代码编译为 Java 源代码的人进行了交谈,然后他们与他们的原生 [=51] 一起构建=] 代码。我很确定如果您使用任何 C 扩展,这将不起作用,但如果这对您来说不是问题,则可能值得考虑。