web-dev-qa-db-ja.com

IronPython vs. Python .NET

PythonコードからC#で記述されたいくつかの.NETアセンブリにアクセスしたい。

少し調査した結果、2つの選択肢があることがわかりました。

  • IronPython .NETインターフェース機能/サポート組み込み
  • Python .NET パッケージを使用したPython

両方のソリューションのトレードオフは何ですか?

80
cschol

主に.NETフレームワークに基づいてコードを作成する場合は、IronPythonとPython.NETを強くお勧めします。 IronPythonはほとんどネイティブの.NETであるため、他の.NET言語と統合する場合に最適に機能します。

Python.NETは、.NETの1つまたは2つのコンポーネントを標準のpythonアプリケーションに統合するだけの場合に適しています。

IronPythonを使用する場合、顕著な違いがありますが、それらのほとんどはかなり微妙です。 Python.NETは標準のCPythonランタイムを使用するため、 このWikiページ は2つの実装の違いに関する関連する議論です。最大の違いは、例外のコストで発生します。したがって、標準のpythonライブラリは、実装のためにIronPythonで同様に機能しません。

68
Reed Copsey

リード・コプシーとアレックス・マルテリの回答に同意する一方で、もう1つの違いを指摘したいと思います。それは、グローバルインタープリターロック(GIL)です。 IronPythonにはGILの制限はありませんが、CPythonにはあります。したがって、GILがボトルネックになっているアプリケーション、たとえば特定のマルチコアシナリオでは、IronPythonはPython.NETよりも優れているように見えます。

Python.NETドキュメントから:

埋め込みに関する重要な注意: Pythonはフリースレッドではなく、グローバルインタープリターロックを使用して、マルチスレッドアプリケーションがPythonインタープリターと安全に対話できるようにします。これに関する詳細は、www.python.org WebサイトのPython C APIドキュメントで入手できます。

マネージアプリケーションにPythonを埋め込む場合、CまたはC++アプリケーションにPythonを埋め込むときと同じ方法でGILを管理する必要があります。

Python.Runtime名前空間によって提供されるオブジェクトまたはAPIとやり取りする前に、呼び出しコードはPythonEngine.AcquireLockメソッドを呼び出してPythonグローバルインタープリターロックを取得している必要があります。このルールの唯一の例外はPythonEngine.Initializeメソッドで、GILを取得せずに起動時に呼び出すことができます。

Python AP​​Iの使用が終了したら、マネージコードは対応するPythonEngine.ReleaseLockを呼び出してGILを解放し、他のスレッドがPythonを使用できるようにする必要があります。

AcquireLockおよびReleaseLockメソッドは、Python AP​​IのアンマネージPyGILState_EnsureおよびPyGILState_Release関数のシンラッパー、およびそれらのAPIのドキュメントです。管理対象バージョンに適用されます。

別の問題は、IDEサポートです。現在、CPythonはIronPythonよりもIDEのサポートが優れている可能性が高いため、これは一方を他方より選択する要因になる可能性があります。

28
Vinay Sajip

科学的および数値的Python CPython C-APIに依存するライブラリ(numpy、scipy、matplotlib、pandas、cythonなど)のほとんどは、主にCPythonで動作します。 pythonnet(他の名前-Python.NETおよびPython)。WxWidgets、PyQt/PySide、GTK、KivyなどのCPython GUIバインディングにも同じことが当てはまりますが、両方ともpythonnetとIronPythonはWPFとWinFormsを使用できます。

そして最後に、IronPythonはPython 3をまだ完全にサポートしていません。

15
denfromufa

IronPythonは「.NETネイティブ」です。したがって、Pythonコードを.NETと完全に統合し、Python.NETはClassic Pythonで動作するため、 Pythonコードの「腕の長さ」を.NETから遠ざけることができます。( このコード を使用すると、IronPythonコードからCPython用に記述された拡張機能を実際に使用できます、それはもはや差別的な条件ではありません)。

9
Alex Martelli

IronPythonはMicrosoftから提供されているので、他のMSFTテクノロジーでより良く再生されると想定しなければならないので、私は自分の直感で最初にそれを使用します。

6
i_am_jorf

2016年。

私の会社ではIronPythonを使用しましたが、パフォーマンスに満足していませんでした(主にメモリ使用-ガベージコレクターが遅すぎる)ので、標準のPythonに切り替えてZeroceを使用して.Netと統合することにしました-s ICE。

4
topolm

IronPythonは現在、Python 3.6(2.7のみ)をサポートしていません

from IronPython "IronPython 3のビルドはまだ提供されていません。"

2
Ariel
  1. IronpythonはC#に似ていますが、C#とは異なり動的言語ですが、静的なビルド済みライブラリに依存しています。

  2. Cpythonは、Ironpythonが動的言語であるようにC++に似ており、動的ライブラリにアクセスできます。

  3. Ironpythonは特定の領域ではC#よりも高速ですが、Cpythonよりも高速ではありません。ただし、Ironpythonを任意の言語にリンクして問題を克服できますが、Cpythonでも同じことができます。

何を選んでも面白い、シンプルで強力な言語!

1
Meh

Iron Pythonは基本的にPython 2.7に統合された.netサポートを備えているため、おそらくサポートされませんPython 3。 CおよびPythonライブラリ。ただし、ツイスト側では.netにアクセスでき、C#で拡張できます。したがって、C#を既に使用している場合、Iron Pythonはボーナス。

0
Anonimoose