我必须使用商业 Java 库,并且想从 Python 中完成。Jython 很健壮,我可以接受它后面的几个 dot 版本。但是,我也想使用 NumPy,这显然不适用于 Jython。CPype和 Java 数字库之类的选项没有吸引力。前者基本上已经死了。后者大多不成熟,缺乏 NumPy 的易用性和广泛接受性。我的问题是:如何让 Jython 和 Python 代码互操作?我可以从 Cpython 或其他方式调用 Jython。
5 回答
具有讽刺意味的是,考虑到 Jython 和 Numeric(NumPy 的祖先)是由同一个开发人员(Jim Hugunin)发起的,他随后也发起了 IronPython,现在在微软担任某种高级架构师职位,致力于各种动态语言支持对于 .NET 和 Silverlight),在 Jython 中使用 numpy没有真正好的方法。据我所知,与此最接近的是“jnumerical”项目——(稀缺的)文档在sourceforge上,但更新的源在bitbucket上。
jnumerical 实现的“Numeric Python”并不像它的 numpy 后代那样流畅和精简,但它具有大致相同的功能并共享许多概念和哲学,所以也许你会发现它很有用——值得一试,至少。
考虑使用execnet,它允许您结合 Jython 和 CPython 的优势,包括当前的 NumPy。这里的缺点是您必须支付在两个不同进程空间中的两个解释器之间序列化/反序列化对象的成本。(您可以通过使用它对子进程的支持来避免网络开销。)但是,考虑到您正在考虑使用 JPype,这种组合可能会很好地工作,它会有类似(并且可能更高)的开销。只需确保您已对工作进行了适当的分区。
Jython 开发人员(我也是其中之一)正在考虑通过支持 C 扩展 API 来支持 NumPy,但这确实是非常初步的计划。
我对 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 之间的列表中移动 6 百万个整数,JPype 慢了几个数量级(但我不记得数字了)
但是,使用 Jcc,您只能包装公共方法,有时这很棘手,特别是如果该方法正在接收或返回某些 java 对象(简而言之,JCC 还必须为传入的对象编译包装器,否则所有方法都使用/返回此类方法不可访问)。因此,除非您需要分发您的代码,否则您最好使用 JEPP。
If you stick to vector and matrix maths, I suggest to have a look onto vectorz. It is a pure Java implementation and shall be 100% usable from within jython. I still didn't try it, but will soon, since I have the same necessity in finding a numpy alternative.