【问题标题】:Using NumPy and Cpython with Jython将 NumPy 和 Cpython 与 Jython 一起使用
【发布时间】:2011-03-07 01:31:24
【问题描述】:

必须使用商业 Java 库,并希望通过 Python 来实现。 Jython 很健壮,我可以接受它后面的几个 dot 版本。但是,我希望也使用 NumPy,这显然不适用于 Jython。 CPype 和 Java 数字库之类的选项没有吸引力。前者基本上已经死了。后者大多不成熟,缺乏 NumPy 的易用性和广泛接受性。我的问题是:如何让 Jython 和 Python 代码互操作?我可以从 Cpython 或其他方式调用 Jython。

【问题讨论】:

标签: java python numpy jython cpython


【解决方案1】:

具有讽刺意味的是,考虑到 Jython 和 Numeric(NumPy 的祖先)是由同一个开发人员发起的(Jim Hugunin,他随后也发起了 IronPython,现在在微软担任某种高级架构师职位,致力于各种.NET 和 Silverlight 的动态语言支持),在 Jython 中没有非常好的方法来使用 numpy。据我所知,与此最接近的是“jnumerical”项目——(稀缺的)文档位于sourceforge,但更新的资源位于bitbucket

“Numeric Python”,jnumerical 实现的,并不像它的 numpy 后代那样流畅和流线型,但它具有大致相同的功能并共享许多概念和哲学,所以也许你会发现它有用——值得至少要退房。

【讨论】:

  • 感恩亚历克斯。然而,我担心的是 jNumerical 处于不确定状态——最后提交的代码可以追溯到 8 年前!从那时起,Java 和 Python 都发生了一些变化。而且版本是0.1a3...
  • @gappy,这些日期 &c 适用于旧的 sourceforge 版本,bitbucket 从来没有,正如我所提到的。
【解决方案2】:

考虑使用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++ 扩展连接 pythonjava(据此:http://www.slideshare.net/onyame/mixing-python-and-java 第 30 页)我试过在 python 和 java 之间移动列表中的 6 百万个整数,JPype 慢了几个数量级(但我不记得数字)

    但是,使用 Jcc,您只能包装公共方法,有时这很棘手,尤其是当该方法正在接收或返回某些 java 对象时(简而言之,JCC 还必须为传入的对象编译包装器,否则所有使用/返回此类方法的方法不可访问)。因此,除非您需要分发代码,否则最好使用 JEPP。

    【讨论】:

      【解决方案4】:

      免责声明:还没有个人经验

      似乎JyNI – Jython Native Interface 是要走的路。

      还有一个newer question posted,它可能有更新的替代品。

      【讨论】:

        【解决方案5】:

        如果您坚持使用向量和矩阵数学,我建议您查看vectorz。 它是一个纯 Java 实现,应在 jython 中 100% 可用。我仍然没有尝试,但很快就会尝试,因为我同样需要找到一个 numpy 替代方案。

        【讨论】:

          猜你喜欢
          • 2010-12-08
          • 2011-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          • 1970-01-01
          • 2011-08-18
          • 2014-12-23
          相关资源
          最近更新 更多