2013-08-28 177 views
4

在搜索一个从Django应用程序(python)运行Java代码的选项后,我发现Py4J对我来说是最好的选择。我试过Jython,JPype和Python子流程,并且它们每个都有一定的局限性:Py4J的开销比Jython和JPype更大

  • Jython。我的应用程序在Python中运行。
  • JPype是越野车。您可以在启动JVM之后再次启动JVM。
  • Python子流程。由于定期的控制台调用,无法在Python和Java之间传递Java对象。

在Py4J网站上写的是:

在性能方面,Py4J比都以前的解决方案(Jython和JPype)的一个更大的开销,因为它依赖于插座,但如果表现对您的应用程序至关重要,从Python程序访问Java对象可能不是最好的主意。

在我的应用程序性能非常关键,因为我正在使用机器学习框架Mahout。我的问题是:由于Py4J网关服务器,Mahout也会运行得更慢,或者这种开销意味着从Python函数调用Java方法会更慢(后者Mahout的性能不会成为问题,我可以使用Py4J)。

+0

您是否真的需要多次启动JVM?为什么? – bastian

回答

1

我不知道Mahout。但想一想:至少在使用JPype和Py4J时,将类型从Java转换为Python时,会有性能影响,反之亦然。尽量减少语言之间的通话。也许这是你用Java编写一个精简包装的替代方案,它可以将许多Java调用压缩为一个python2java调用。

0

PySpark相当成功地使用Py4J。如果所有的重载都是在Spark(或者Mahout)上完成的,并且你只是想返回结果返回到“driver”/ Python代码,那么Py4J也可以为你工作。

1

因为性能也是一个关于你使用screnario的问题(你如何经常调用脚本,以及如何大是移动的数据),因为不同的解决方案都有自己具体的好处/缺点,我已经创建了一个API在不需要更改Python脚本的情况下在不同的实现之间切换:https://github.com/subes/invesdwin-context-python

因此,测试什么是最好的或只是灵活地部署到什么是非常容易的。