0

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

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

效率应该是最关心的问题,因为我需要重复运行相同的java 函数。

4

1 回答 1

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