商用の Java ライブラリを使用する必要があり、Python から実行したいと考えています。Jython は堅牢で、数ドット リリースが遅れていることに問題はありません。ただし、Jython では明らかに機能しない NumPy も使用したいと考えています。CPypeや Java 数値ライブラリなどのオプションは魅力的ではありません。前者は本質的に死んでいます。後者はほとんどが未熟で、NumPy の使いやすさと広く受け入れられていないものです。私の質問は次のとおりです。Jython と Python コードを相互運用するにはどうすればよいですか? Cpython またはその逆から Jython を呼び出すことは許容されます。
5 に答える
Jython と Numeric (NumPy の祖先) が同じ開発者によって開始されたことを考えると、皮肉なことです (Jim Hugunin はその後、IronPython も開始し、現在は Microsoft で何らかのシニア アーキテクトの地位にあり、あらゆる種類の動的言語サポートに取り組んでいます)。 .NET および Silverlight の場合)、Jython で numpy を使用する本当に良い方法はありません。私が知っていることに最も近いのは、「jnumerical」プロジェクトです。(希少な) ドキュメントはsourceforgeにありますが、更新されたソースはbitbucketにあります。
jnumerical が実装する "Numeric Python" は、その numpy の子孫ほど洗練された合理化されたものではありませんが、機能はほぼ同じであり、多くの概念と哲学を共有しているため、おそらく使用可能であることがわかります。チェックする価値があります。少なくとも。
現在の NumPy を含む、Jython と CPython の両方の長所を組み合わせることができるexecnetの使用を検討してください。ここでの欠点は、2 つの異なるプロセス空間で 2 つのインタープリター間でオブジェクトをシリアル化/逆シリアル化するコストを支払う必要があることです。(サブプロセスのサポートを使用することで、ネットワークのオーバーヘッドを回避できます。)しかし、同様の(そしておそらくより高い)オーバーヘッドを持つJPypeを検討していることを考えると、このような組み合わせはうまくいくかもしれません。作業を適切に分割したことを確認してください。
Jython 開発者 (そして私もその 1 人) は、C 拡張 API のサポートを介して、将来 NumPy をサポートすることを検討していますが、これは実際には非常に予備的な計画です。
私はJythonCExtension APIを非常によく見ています!それは素晴らしいでしょう!
その時点まで、2つの選択肢があると思います。
http://jepp.sourceforge.net/ PythonをJavaに埋め込むための、優れたコンソールがあります。不利な点は、私にとっては大きすぎる不利な点ですが、自分のPythonに対してコンパイルする必要があるということです。そして、Pythonのアップグレードでは、再コンパイルする必要があります(拡張機能をコンパイルして使用するために、Pythonをコンパイルしたくありません-特に、コードを別のマシン、たとえばグリッドで実行する必要がある場合は、それも不可能です。 )。
http://lucene.apache.org/pylucene/jcc/-これはluceneや他の多くのプロジェクトに使用されます。私は個人的にGATENLPエンジンとsolrをラップするために使用しています。Pythonで利用できるようにするため。Jccは(デッド)JPypeよりもはるかに高速です。おそらく、一部のデータ構造(リストなど)が最適化されており、C++拡張機能を介してpython<-> javaとインターフェイスしているためです(これによると:http://www.slideshare.net / onyame / mixed-python-and-java 30ページ)リスト内の6milの整数をpythonとjavaの間で移動しようとしましたが、JPypeは桁違いに遅くなりました(ただし、数値は覚えていません)
ただし、Jccを使用すると、パブリックメソッドのみをラップできます。特に、そのメソッドが特定のJavaオブジェクトを受信または返す場合は注意が必要です(つまり、JCCは、渡されたオブジェクトのラッパーもコンパイルする必要があります。それ以外の場合は、すべてのメソッドを使用します。 /そのようなメソッドを返すことはアクセスできません)。したがって、コードを配布する必要がない限り、JEPPを使用する方が得策です。