使用NumPy和Cpython与Jython配合使用

17

必须使用商业Java库,想要从Python中使用。Jython稳定可靠,即使版本稍落后也没关系。然而,我希望也能使用NumPy,但这显然与Jython不兼容。CPype和Java数值库等选项并不理想。前者已经基本停止维护。后者大多都还不够成熟,缺乏NumPy易用性和广泛接受程度。我的问题是:如何实现Jython和Python代码之间的互操作?对我来说,从Cpython调用Jython或者反过来都可以接受。


1
图书馆的成本比在Python中学习如何使用它的成本高还是低? - Seth
JPype可能已经停止维护,但它仍然可以很好地工作,例如请参考https://dev59.com/zWTWa4cB1Zd3GeqPACGa - Mannaggia
5个回答

20
考虑到Jython和Numeric(NumPy的祖先)由同一位开发者Jim Hugunin发起(他后来还发起了IronPython并担任微软的高级架构师,致力于为.NET和Silverlight提供各种动态语言支持),这是具有讽刺意味的,没有真正好用的方法在Jython中使用numpy。我所知道的最接近它的东西是"jnumerical"项目——文档很少,在sourceforge上,但更新的源代码在bitbucket上。
"Numeric Python",即jnumerical实现的内容,不像其numpy后代那样流畅和简洁,但它具有大约相同的功能,并分享许多概念和哲学,因此也许你可以找到它可用——至少值得一试。

谢谢Alex。然而,我的担忧是jNumerical处于停滞状态——最后提交的代码已经超过8年了!自那时以来,Java和Python都有所改变。而且版本是0.1a3... - gappy
@gappy,这些日期等适用于旧的sourceforge版本,正如我之前提到的,bitbucket的版本从未使用过。 - Alex Martelli

11
考虑使用 execnet,它允许您结合 Jython 和 CPython 的优点,包括当前的 NumPy。缺点是您需要支付在两个不同进程空间中的两个解释器之间序列化/反序列化对象的成本。(您可以使用其对子进程的支持避免网络开销。)但是这样的组合可能效果良好,尤其是考虑到您正在考虑使用 JPype,此时开销可能更高。只要确保已经适当地划分了工作。

Jython 开发人员(我是其中之一)正在研究通过支持 C 扩展 API,在将来支持 NumPy,但这实际上仍处于初步规划阶段。

3

我非常期待Jython C扩展API的推出!那将是很棒的!

在那之前,我认为你有两个选择:

  • http://jepp.sourceforge.net/ 用于在Java中嵌入Python,它有一个不错的控制台。缺点是需要针对自己的Python进行编译。随着Python升级,您必须重新编译(我不想编译Python,以便编译和使用扩展 - 这也是不可能的,特别是如果代码应在不同的机器上执行,例如在网格上)

  • http://lucene.apache.org/pylucene/jcc/ - 用于Lucene和许多其他项目。我个人使用它来包装GATE NLP引擎和Solr,以使其可用于Python。 Jcc比(已死)JPype快得多,可能是因为一些数据结构(如列表)被优化,并且还因为它通过C ++扩展与Python<->java接口(根据此:http://www.slideshare.net/onyame/mixing-python-and-java第30页)。我尝试在Python和Java之间移动600万个整数列表,JPype的速度慢了几个数量级(但我不记得数字)

然而,使用Jcc,您只能包装公共方法,有时会很棘手,特别是如果该方法接收或返回某些Java对象(简而言之,JCC还必须为传入的对象编译包装器,否则所有使用/返回此类方法的方法都无法访问)。因此,除非您需要分发代码,否则最好使用JEPP。


3

1
如果您坚持使用向量和矩阵数学,我建议您看一下vectorz。它是一个纯Java实现,应该可以在jython内完全使用。我还没有尝试过,但很快就会尝试,因为我也需要找到一个numpy的替代品。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接