PythonコードからC#で記述されたいくつかの.NETアセンブリにアクセスしたい。
少し調査した結果、2つの選択肢があることがわかりました。
両方のソリューションのトレードオフは何ですか?
主に.NETフレームワークに基づいてコードを作成する場合は、IronPythonとPython.NETを強くお勧めします。 IronPythonはほとんどネイティブの.NETであるため、他の.NET言語と統合する場合に最適に機能します。
Python.NETは、.NETの1つまたは2つのコンポーネントを標準のpythonアプリケーションに統合するだけの場合に適しています。
IronPythonを使用する場合、顕著な違いがありますが、それらのほとんどはかなり微妙です。 Python.NETは標準のCPythonランタイムを使用するため、 このWikiページ は2つの実装の違いに関する関連する議論です。最大の違いは、例外のコストで発生します。したがって、標準のpythonライブラリは、実装のためにIronPythonで同様に機能しません。
リード・コプシーとアレックス・マルテリの回答に同意する一方で、もう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 APIの使用が終了したら、マネージコードは対応する
PythonEngine.ReleaseLock
を呼び出してGILを解放し、他のスレッドがPythonを使用できるようにする必要があります。
AcquireLock
およびReleaseLock
メソッドは、Python APIのアンマネージPyGILState_Ensure
およびPyGILState_Release
関数のシンラッパー、およびそれらのAPIのドキュメントです。管理対象バージョンに適用されます。
別の問題は、IDEサポートです。現在、CPythonはIronPythonよりもIDEのサポートが優れている可能性が高いため、これは一方を他方より選択する要因になる可能性があります。
科学的および数値的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をまだ完全にサポートしていません。
IronPythonは「.NETネイティブ」です。したがって、Pythonコードを.NETと完全に統合し、Python.NETはClassic Pythonで動作するため、 Pythonコードの「腕の長さ」を.NETから遠ざけることができます。( このコード を使用すると、IronPythonコードからCPython用に記述された拡張機能を実際に使用できます、それはもはや差別的な条件ではありません)。
IronPythonはMicrosoftから提供されているので、他のMSFTテクノロジーでより良く再生されると想定しなければならないので、私は自分の直感で最初にそれを使用します。
2016年。
私の会社ではIronPythonを使用しましたが、パフォーマンスに満足していませんでした(主にメモリ使用-ガベージコレクターが遅すぎる)ので、標準のPythonに切り替えてZeroceを使用して.Netと統合することにしました-s ICE。
IronPythonは現在、Python 3.6(2.7のみ)をサポートしていません
from IronPython "IronPython 3のビルドはまだ提供されていません。"
IronpythonはC#に似ていますが、C#とは異なり動的言語ですが、静的なビルド済みライブラリに依存しています。
Cpythonは、Ironpythonが動的言語であるようにC++に似ており、動的ライブラリにアクセスできます。
Ironpythonは特定の領域ではC#よりも高速ですが、Cpythonよりも高速ではありません。ただし、Ironpythonを任意の言語にリンクして問題を克服できますが、Cpythonでも同じことができます。
何を選んでも面白い、シンプルで強力な言語!
Iron Pythonは基本的にPython 2.7に統合された.netサポートを備えているため、おそらくサポートされませんPython 3。 CおよびPythonライブラリ。ただし、ツイスト側では.netにアクセスでき、C#で拡張できます。したがって、C#を既に使用している場合、Iron Pythonはボーナス。