【问题标题】:What is the best way to run the same java function repeatedly in python?在 python 中重复运行相同的 java 函数的最佳方法是什么?
【发布时间】:2018-09-17 03:35:43
【问题描述】:

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

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

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

【问题讨论】:

  • Jython 不是库。它是在 JVM 上运行并可以本地访问任何 Java 代码的 python 解释器(与 CPython 相对)的替代实现。这辈子不存在“最好的方法”。选择更适合您的项目的内容。
  • @lakshman 感谢您的评论,只是意识到我没有正确表达我的问题。现在我对其进行了修改,强调了广泛对同一功能的使用
  • @cricket_007 就像一次又一次地调用同一个函数。只是把单词改成重复
  • 我现在明白了...所以,我要问 - 你能把这个过程重写成 C/C++ 之类的东西并使用 Swig,例如在 Java 和 Python 之间共享这个函数吗?

标签: java python subprocess jython jpype


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

【讨论】:

  • 考虑到 Apache Spark 将 Py4J 用于其目的,我认为它是 Jython 背后的最佳选择
  • @cricket_007 据我了解,Spark 仅使用 Py4J 启动 JVM 并设置一个用作自定义 Spark 消息控制通道的套接字,而实际数据通过相同类型的用于分布式 Python-Python 或 Scala-Scala 计算的管道。
  • 这是否意味着所有的 jython、jpype、py4j 都已被弃用?没有人仍在积极开发中?
  • @huangzonghao 没有任何官方地位的人正式弃用其中任何一个,并且有人在某种程度上致力于它们,但很有可能你遇到的任何问题都无法解决。
  • @huangzonghao 老实说,我已经很久没有使用 Swig 了。一旦你知道你在做什么——特别是如果你正在编写你想要暴露给 Python 的 C++(或 C、D 或 Rust)代码,那么在 Cython 或 PyCxx 之类的库中更容易,或者只是公开一个 C API 并改用 cffi。但 Swig 的基础学习曲线可能较低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多