IronPython vs. Python .NET

88

Saya ingin mengakses beberapa rakitan .NET yang ditulis dalam C # dari kode Python.

Sedikit penelitian menunjukkan bahwa saya memiliki dua pilihan:

Apa trade-off antara kedua solusi tersebut?

cschol.dll
sumber

Jawaban:

71

Jika Anda ingin mendasarkan kode Anda pada kerangka .NET, saya sangat merekomendasikan IronPython vs Python.NET. IronPython cukup banyak asli .NET - jadi itu hanya berfungsi dengan baik ketika mengintegrasikan dengan bahasa .NET lainnya.

Python.NET bagus jika Anda hanya ingin mengintegrasikan satu atau dua komponen dari .NET ke dalam aplikasi python standar.

Ada perbedaan mencolok saat menggunakan IronPython - tetapi kebanyakan tidak terlalu kentara. Python.NET menggunakan runtime CPython standar, jadi halaman Wiki ini adalah diskusi yang relevan tentang perbedaan antara dua implementasi. Perbedaan terbesar terjadi pada biaya pengecualian - jadi beberapa pustaka python standar tidak berkinerja baik di IronPython karena implementasinya.

Reed Copsey
sumber
11
IronPython memiliki pengecualian "ringan" sekarang yang jauh lebih cepat. Pengujian TryRaiseExcept dari PyBench yang berkinerja 60 kali lebih lambat, kini hanya 1,6 kali lebih lambat. WithRaiseExcept masih lambat, tetapi 4 kali lebih cepat dari sebelumnya. Untuk sebagian besar pengujian lainnya, IPy sebenarnya lebih cepat . Perbandingan kinerja IronPython 2.7 vs CPython 2.7 ( daftar lengkap tolok ukur ).
Athari
29

Sementara setuju dengan jawaban yang diberikan oleh Reed Copsey dan Alex Martelli, saya ingin menunjukkan satu perbedaan lebih lanjut - Global Interpreter Lock (GIL). Sementara IronPython tidak memiliki batasan GIL, CPython memilikinya - jadi akan tampak bahwa untuk aplikasi-aplikasi di mana GIL adalah penghambat, katakanlah dalam skenario multicore tertentu, IronPython memiliki keunggulan dibandingkan Python.NET.

Dari dokumentasi Python.NET:

Catatan Penting untuk embedder: Python tidak free-threaded dan menggunakan kunci interpreter global untuk memungkinkan aplikasi multi-threaded berinteraksi dengan aman dengan interpreter Python. Lebih banyak informasi tentang ini tersedia di dokumentasi Python C API di www.python.orgSitus Web.

Saat menyematkan Python dalam aplikasi terkelola, Anda harus mengelola GIL dengan cara yang sama seperti saat Anda menyematkan Python dalam aplikasi C atau C ++.

Sebelum berinteraksi dengan objek atau API apa pun yang disediakan oleh Python.Runtimenamespace, kode pemanggil harus telah memperoleh kunci interpreter global Python dengan memanggil PythonEngine.AcquireLockmetode tersebut. Satu-satunya pengecualian untuk aturan ini adalah PythonEngine.Initializemetode, yang dapat dipanggil saat permulaan tanpa memperoleh GIL.

Setelah selesai menggunakan Python API, kode yang dikelola harus memanggil yang sesuai PythonEngine.ReleaseLockuntuk merilis GIL dan mengizinkan utas lain menggunakan Python.

Metode AcquireLockdan ReleaseLock adalah pembungkus tipis atas fungsi PyGILState_Ensuredan yang tidak dikelola PyGILState_Releasedari Python API, dan dokumentasi untuk API tersebut berlaku untuk versi yang dikelola.

Masalah lainnya adalah dukungan IDE. CPython mungkin memiliki dukungan IDE yang lebih baik saat ini daripada IronPython - jadi ini mungkin menjadi faktor dalam memilih salah satu dari yang lain.

Vinay Sajip
sumber
4
Plugin PyDev Eclipse mendukung CPython, IronPython dan Jython.
Knut Eldhuset
3
@Knut: Benar, tapi bukan itu situasinya ketika saya menulis jawaban ini.
Vinay Sajip
18

Sebagian besar pustaka ilmiah dan numerik Python yang mengandalkan CPython C-API (numpy, scipy, matplotlib, pandas, cython, dll.) Sebagian besar bekerja di bawah CPython, jadi dalam hal ini taruhan terbaik Anda adalah pythonnet (nama lain - Python.NET dan Python untuk .NET). Hal yang sama juga berlaku untuk binding CPython GUI seperti WxWidgets, PyQt / PySide, GTK, Kivy, dll., Meskipun pythonnet dan IronPython dapat menggunakan WPF dan WinForms.

Dan akhirnya IronPython belum sepenuhnya mendukung Python 3.

denfromufa
sumber
9

IronPython adalah ".NET-native" - ​​jadi akan lebih disukai jika Anda ingin mengintegrasikan sepenuhnya kode Python Anda dengan .NET sepenuhnya; Python.NET bekerja dengan Classic Python, jadi ini memungkinkan Anda menjaga "lengan panjang" kode Python Anda dari .NET sesuai. (Perhatikan bahwa dengan kode ini Anda sebenarnya dapat menggunakan ekstensi yang ditulis untuk CPython dari kode IronPython Anda, jadi itu bukan kondisi yang membedakan lagi).

Alex Martelli
sumber
6

IronPython berasal dari Microsoft, jadi saya akan menggunakan keberanian saya dan menggunakan yang pertama karena Anda harus berasumsi itu akan bermain lebih baik dengan teknologi MSFT lainnya.

i_am_jorf
sumber
saya meragukan ini karena ini bukan bagian dari vs20xx
user3800527
4

Adapun tahun 2016.

Di perusahaan saya, kami menggunakan IronPython, tetapi kami tidak puas dengan kinerjanya (kebanyakan penggunaan memori - pengumpul sampah terlalu lambat) jadi kami memutuskan untuk beralih ke Python standar dan mengintegrasikannya dengan .Net menggunakan Zeroce-s ICE.

topolm
sumber
Saya terkejut bahwa RPC di antara proses yang berbeda dipilih karena alasan kinerja. Kemungkinan besar CPython + .NET menggunakan pythonnet dalam proses yang sama harus lebih cepat daripada pendekatan ini. Adapun catatan Zeroce ICE bahwa itu berlisensi GPL dan sangat tidak cocok untuk aplikasi komersial.
denfromufa
Solusi yang menarik, terima kasih. Sedangkan untuk perizinan, ada opsi komersial untuk ICE: zeroc.com/licensing
Atorian
1
  1. Ironpython seperti C # pada gilirannya bergantung pada pustaka prebuilt statis sementara tidak seperti C # adalah bahasa dinamis.

  2. Cpython seperti C ++ seperti Ironpython adalah bahasa dinamis dan memiliki akses ke pustaka dinamis yang pada gilirannya diterjemahkan menjadi dipaksa untuk menulis semuanya.

  3. Ironpython lebih cepat dari C # di area tertentu tetapi tidak lebih cepat dari Cpython, namun Anda dapat menautkan Ironpython ke bahasa apa pun sehingga mengatasi masalah yang akan datang tetapi sekali lagi Anda dapat melakukan hal yang sama dengan Cpython.

Bahasa yang lucu, sederhana, dan kuat apa pun yang Anda pilih!

Meh
sumber
1

Iron Python pada dasarnya adalah Python 2.7 dengan dukungan .net terintegrasi, ia mungkin tidak akan pernah mendukung Python 3. Ia kehilangan pustaka C dan Python, namun di sisi twist memiliki akses ke .net dan dapat diperpanjang dengan C #. Jadi jika Anda sudah menggunakan C # maka Iron Python adalah bonus.

Anonimoose
sumber
-1

Saya lebih suka Python untuk .NET, karena IronPython dikompilasi sebagai kode yang dikelola, yang dapat dengan mudah didekompilasi (yang paling saya benci), tetapi dengan py2exe atau pyinstaller Anda dapat mengkompilasi Python dengan modul NET sebagai aplikasi yang tidak dikelola.

XorTroll
sumber