IronPythonとPython.NET


88

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

少し調べてみると、2つの選択肢があることがわかりました。

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

回答:


71

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

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

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


11
IronPythonには、はるかに高速な「軽量」の例外があります。PyBenchのTryRaiseExceptテストの実行速度は60倍遅くなりましたが、現在はわずか1.6倍遅くなっています。WithRaiseExceptはまだ遅いですが、以前の4倍高速です。他のほとんどのテストでは、IPyの方が実際には高速です。IronPython2.7とCPython2.7のパフォーマンスの比較ベンチマークの完全なリスト)。
アタリ2013年

29

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

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

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

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

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

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

AcquireLockおよびReleaseLock 方法は、アンマネージ上に薄いラッパーですPyGILState_Ensureし、 PyGILState_ReleasePythonのAPIからの機能、およびこれらのAPIのドキュメントは、管理対象のバージョンに適用されます。

もう1つの問題はIDEのサポートです。CPythonはおそらく現在IronPythonよりも優れたIDEサポートを備えているため、これがどちらかを選択する際の要因となる可能性があります。


4
PyDev Eclipseプラグインは、CPython、IronPython、およびJythonをサポートします。
Knut Eldhuset 2010

3
@Knut:そうですが、私がこの回答を書いたときはそうではありませんでした。
Vinay Sajip 2010

18

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

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


9

IronPythonは「.NETネイティブ」であるため、Pythonコードを.NETと完全に統合する場合に適しています。Python.NETはクラシックPythonで動作するため、Pythonコードの「独立企業間原則」を.NETから適切に遠ざけることができます。(このコードを使用すると、IronPythonコードからCPython用に記述された拡張機能を実際に使用できるため、これはもはや識別条件ではないことに注意してください)。


6

IronPythonはMicrosoftから提供されているので、他のMSFTテクノロジでより適切に動作すると想定する必要があるため、最初にそれを使用します。


vs20xxの一部ではないのでこれを疑う
user3800527

4

2016年も。

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


パフォーマンス上の理由から、異なるプロセス間のRPCが選択されたことに驚いています。同じプロセスでpythonnetを使用するCPython + .NETは、このアプローチよりも高速である可能性があります。Zeroce ICEについては、GPLライセンスであるため、商用アプリケーションにはあまり適していないことに注意してください。
denfromufa 2016

興味深い解決策、ありがとう。ライセンスに関しては、ICEの商用オプションがあります:zeroc.com/licensing
Atorian


1
  1. IronpythonはC#に似ていますが、C#は動的言語であるのに対し、静的なビルド済みライブラリに依存しています。

  2. CpythonはC ++のようなもので、Ironpythonは動的言語であり、動的ライブラリにアクセスできるため、すべてを強制的に書き込むことになります。

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

何を選んでも、面白くてシンプルでパワフルな言語!


1

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


-1

IronPythonは簡単に逆コンパイルできるマネージコードとしてコンパイルされるため(私が最も嫌うもの)、私は主にPython for .NETを好みますが、py2exeまたはpyinstallerを使用すると、アンマネージアプリケーションとしてNETモジュールを使用してPythonをコンパイルできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.