繁体   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