在Jython中使用NumPy和Cpython

17 投票
5 回答
22462 浏览
提问于 2025-04-16 00:18

我必须使用一个商业的Java库,并且想要在Python中使用它。Jython很稳定,我也能接受它版本稍微落后一些。不过,我还想用NumPy,而显然Jython不能和NumPy一起工作。像CPype这样的选项我不太喜欢,因为它基本上已经不再更新了。而其他的Java数值库大多数还不成熟,使用起来也没有NumPy那么方便和广泛被接受。我的问题是:怎么才能让Jython和Python的代码互相调用呢?我可以接受从Cpython调用Jython,或者反过来。

5 个回答

3

我非常期待Jython C扩展API!那真是太棒了!

在那之前,我觉得你有两个选择:

  • http://jepp.sourceforge.net/ 这个可以把Python嵌入到Java中,它有一个不错的控制台。不过对我来说,最大的缺点是它需要和你自己的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会更好。

11

可以考虑使用execnet,这个工具可以让你把Jython和CPython的优点结合起来,包括现在的NumPy。不过,这里有个缺点,就是你需要花时间把对象在两个不同的解释器之间进行转换,这个过程会有点麻烦。(不过,如果你使用它的子进程支持,可以避免一些网络延迟。)不过,考虑到你在看JPype,它的开销可能差不多甚至更高,所以这样的组合可能还是挺有效的。只要确保你合理地分配了工作就行。

Jython的开发者们(我也是其中之一)正在考虑未来支持NumPy,通过支持C扩展API,但这目前还处于初步规划阶段。

20

这真是有点讽刺,因为Jython和Numeric(NumPy的前身)都是由同一个开发者(Jim Hugunin)发起的。Jim后来又开发了IronPython,现在在微软担任高级架构师,负责支持各种动态语言在.NET和Silverlight上的应用。然而,使用numpy在Jython中却没有一个真正好的方法。我所知道的最接近的选择是“jnumerical”项目——相关的文档很少,可以在sourceforge上找到,但更新的源代码在bitbucket上。

“Numeric Python”,也就是jnumerical实现的内容,并没有像它的后代numpy那样流畅和简洁,但它的功能差不多,很多概念和理念也很相似,所以你可能会觉得它还可以用——至少值得一试。

撰写回答