IronPython ve Python .NET


88

Python kodundan C # ile yazılmış bazı .NET derlemelerine erişmek istiyorum.

Küçük bir araştırma iki seçeneğim olduğunu gösterdi:

Her iki çözüm arasındaki değiş tokuşlar nelerdir?

Yanıtlar:


71

Kodunuzu esas olarak .NET çerçevesine dayandırmak istiyorsanız, Python.NET'e karşı IronPython'u şiddetle tavsiye ederim. IronPython oldukça doğal bir .NET'tir - bu nedenle diğer .NET dilleri ile bütünleştirilirken harika çalışır.

Python.NET, .NET'teki bir veya iki bileşeni standart bir python uygulamasına entegre etmek istiyorsanız iyidir.

IronPython kullanırken dikkate değer farklılıklar vardır - ancak çoğu oldukça ince. Python.NET, standart CPython çalışma zamanını kullanır, bu nedenle bu Wiki sayfası , iki uygulama arasındaki farklarla ilgili bir tartışmadır. En büyük farklar, istisnaların maliyetinde meydana gelir - bu nedenle bazı standart python kitaplıkları, uygulamaları nedeniyle IronPython'da iyi performans göstermez.


11
IronPython'da artık çok daha hızlı olan "hafif" istisnalar var. PyBench'ten 60 kat daha yavaş performans gösteren bir TryRaiseExcept testi şimdi sadece 1,6 kat daha yavaş. WithRaiseExcept hala yavaş, ancak öncekinden 4 kat daha hızlı. Diğer testlerin çoğu için IPy aslında daha hızlıdır . IronPython 2.7 ve CPython 2.7 performans karşılaştırması ( kıyaslamaların tam listesi ).
Athari

29

Reed Copsey ve Alex Martelli tarafından verilen cevaplara katılırken, bir fark daha belirtmek isterim - Global Tercüman Kilidi (GIL). IronPython, GIL'in sınırlamalarına sahip olmasa da, CPython sahiptir - bu nedenle, GIL'in bir darboğaz olduğu uygulamalar için, örneğin bazı çok çekirdekli senaryolarda, IronPython'un Python.NET'e göre bir avantajı olduğu görülmektedir.

Python.NET belgelerinden:

Gömücüler için Önemli Not: Python serbest iş parçacıklı değildir ve çok iş parçacıklı uygulamaların Python yorumlayıcısıyla güvenli bir şekilde etkileşime girmesine izin vermek için genel bir yorumlayıcı kilidi kullanır. Bununla ilgili çok daha fazla bilgi, www.python.orgWeb Sitesindeki Python C API belgelerinde mevcuttur .

Python'u yönetilen bir uygulamaya yerleştirirken, GIL'i Python'u bir C veya C ++ uygulamasına yerleştirirken yaptığınız gibi yönetmeniz gerekir.

Ad Python.Runtimealanı tarafından sağlanan herhangi bir nesne veya API ile etkileşime girmeden önce , çağırma kodunun, PythonEngine.AcquireLockyöntemi çağırarak Python genel yorumlayıcı kilidini almış olması gerekir . Bu kuralın tek istisnası PythonEngine.Initialize, başlangıçta GIL edinilmeden çağrılabilen yöntemdir.

Python API'lerinin kullanılması bittiğinde, yönetilen kodun PythonEngine.ReleaseLockGIL'i serbest bırakmak için bir karşılık gelen çağırması ve diğer iş parçacıklarının Python'u kullanmasına izin vermesi gerekir.

AcquireLockVe ReleaseLock yöntemler yönetilmeyen üzerinde ince sargı olan PyGILState_Ensureve PyGILState_ReleasePython API fonksiyonları ve bu API'ler için dokümantasyon yönetilen sürümleri için geçerlidir.

Diğer bir konu ise IDE desteğidir. CPython muhtemelen şu anda IronPython'dan daha iyi IDE desteğine sahiptir - bu nedenle bu, birini diğerine tercih etmede bir faktör olabilir.


4
PyDev Eclipse eklentisi CPython, IronPython ve Jython'u destekler.
Knut Eldhuset

3
@Knut: Doğru, ama bu cevabı yazdığımdaki durum bu değildi.
Vinay Sajip

18

CPython C-API'ye (numpy, scipy, matplotlib, pandas, cython, vb.) Dayanan bilimsel ve sayısal Python kitaplıklarının çoğu çoğunlukla CPython altında çalışmaktadır, bu nedenle bu durumda en iyi bahsiniz pythonnet'dir (diğer isimler - Python.NET ve .NET için Python). Aynısı WxWidgets, PyQt / PySide, GTK, Kivy vb. CPython GUI bağlantıları için de geçerlidir, ancak hem pythonnet hem de IronPython WPF ve WinForms kullanabilir.

Son olarak, IronPython henüz Python 3'ü tam olarak desteklemiyor.


9

IronPython ".NET-yerli" dir - bu nedenle Python kodunuzu .NET ile tamamen entegre etmek istiyorsanız tercih edilir; Python.NET Klasik Python ile çalışır, bu nedenle Python kodunuzun "kol uzunluğunu" .NET'ten uygun şekilde uzak tutmanıza izin verir. ( Bu kodla , gerçekten de IronPython kodunuzdan CPython için yazılmış uzantıları kullanabileceğinizi unutmayın, bu nedenle bu artık ayırt edici bir durum değildir).


6

IronPython Microsoft'tan geliyor, bu yüzden diğer MSFT teknolojileriyle daha iyi oynayacağını varsaymak zorunda olduğunuz için içgüdülerimle gidip onu ilk önce kullanacağım.


bunun vs20xx'in bir parçası olmadığından şüpheliyim
user3800527

4

2016 yılına gelince.

Şirketimde IronPython kullandık, ancak performanslardan memnun kalmadık (çoğunlukla bellek kullanımı - çöp toplayıcı çok yavaştı), bu yüzden standart Python'a geçmeye ve Zeroce-s ICE kullanarak .Net ile entegre etmeye karar verdik.


Performans nedenleriyle farklı işlemler arasında RPC'nin seçilmesine şaşırdım. Büyük olasılıkla aynı işlemde pythonnet kullanan CPython + .NET, bu yaklaşımdan daha hızlı olmalıdır. Zeroce ICE'ye gelince, GPL lisanslı olduğunu ve bu nedenle ticari uygulamalar için pek uygun olmadığını unutmayın.
denfromufa

İlginç bir çözüm, teşekkürler. Lisanslamaya gelince, ICE için ticari bir seçenek var: zeroc.com/licensing
Atorian


1
  1. Ironpython, C # gibidir, sırayla statik önceden oluşturulmuş kitaplıklara dayanırken, C # dinamik bir dildir.

  2. Cpython da C ++ gibidir, Ironpython da dinamik bir dildir ve dinamik kitaplıklara erişimi vardır, bu da her şeyi yazmaya zorlanmak anlamına gelir.

  3. Ironpython, belirli alanlarda C # 'dan daha hızlıdır ancak Cpython'dan daha hızlı değildir, ancak Ironpython'u herhangi bir dile bağlayabilirsiniz, böylece ortaya çıkan sorunların üstesinden gelebilirsiniz, ancak aynı şeyi Cpython ile de yapabilirsiniz.

Ne seçerseniz seçin eğlenceli, basit ve güçlü bir dil!


1

Iron Python temelde entegre .net destekli Python 2.7'dir ve muhtemelen Python 3'ü asla desteklemeyecektir. C ve Python kitaplıklarında kaybolur, ancak bükülme tarafında .net'e erişimi vardır ve C # ile genişletilebilir. Yani zaten C # kullanıyorsanız Iron Python bir bonus.


-1

Ağırlıklı olarak .NET için Python'u tercih ediyorum, çünkü IronPython yönetilen kod olarak derleniyor, bu da kolayca derlenebiliyor (en çok nefret ettiğim şey), ancak py2exe veya pyinstaller ile Python'u NET modülü ile yönetilmeyen bir uygulama olarak derleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.