IronPython проти Python .NET


88

Я хочу отримати доступ до деяких збірок .NET, написаних на C #, з коду Python.

Невелике дослідження показало, що у мене є два варіанти:

Які компроміси між обома рішеннями?

Відповіді:


71

Якщо ви хочете в основному базувати свій код на .NET framework, я настійно рекомендую IronPython проти Python.NET. IronPython є майже рідною .NET - тому він просто чудово працює при інтеграції з іншими мовами .NET.

Python.NET - це добре, якщо ви хочете просто інтегрувати один або два компоненти .NET у стандартну програму python.

Існують помітні відмінності при використанні IronPython - але більшість з них досить тонкі. Python.NET використовує стандартний час виконання CPython, тому ця сторінка Wiki є відповідним обговоренням відмінностей між двома реалізаціями. Найбільші відмінності виникають у вартості винятків - тому деякі стандартні бібліотеки python не працюють так добре в IronPython через їх реалізацію.


11
Зараз IronPython має "легкі" винятки, які набагато швидші. Тест TryRaiseExcept від PyBench, який виконував у 60 разів повільніше, а тепер лише в 1,6 рази повільніше. WithRaiseExcept все ще працює повільно, але в 4 рази швидше, ніж раніше. Для більшості інших тестів IPy насправді швидший . Порівняння продуктивності IronPython 2.7 та CPython 2.7 (повний список тестів ).
Атарі

29

Погоджуючись з відповідями Рід Копсі та Алекс Мартеллі, я хотів би зазначити ще одну відмінність - Глобальний перекладач (GIL). Хоча IronPython не має обмежень GIL, CPython - тому, здається, для тих додатків, де GIL є вузьким місцем, скажімо в деяких багатоядерних сценаріях, IronPython має перевагу над Python.NET.

З документації Python.NET:

Важлива примітка для вбудовувачів: Python не має вільних потоків і використовує глобальну блокування інтерпретатора, щоб багатопотокові програми могли безпечно взаємодіяти з інтерпретатором Python. Набагато більше інформації про це можна знайти в документації API Python C на www.python.orgвеб-сайті.

При вбудовуванні Python в керовану програму, ви повинні керувати GIL точно так само, як і при вбудовуванні Python в програму C або C ++.

Перш ніж взаємодіяти з будь-якими об'єктами або API, наданими Python.Runtimeпростором імен, викличний код повинен отримати блокування глобального інтерпретатора Python, викликавши PythonEngine.AcquireLockметод. Єдиним винятком з цього правила є PythonEngine.Initializeметод, який може бути викликаний під час запуску без отримання GIL.

Завершивши використання API Python, керований код повинен викликати відповідний, PythonEngine.ReleaseLockщоб звільнити GIL і дозволити іншим потокам використовувати Python.

Методи AcquireLockand і ReleaseLock являють собою тонкі обгортки над некерованими PyGILState_Ensureта PyGILState_Releaseфункціями Python API, і документація до цих API стосується керованих версій.

Інше питання - підтримка IDE. CPython, мабуть, зараз має кращу підтримку IDE, ніж IronPython - тому це може бути фактором при виборі одного над іншим.


4
Плагін PyDev Eclipse підтримує CPython, IronPython та Jython.
Knut Eldhuset

3
@Knut: Так, але це не була ситуація, коли я писав цю відповідь.
Vinay Sajip

18

Більшість наукових та числових бібліотек Python, які покладаються на CPython C-API (numpy, scipy, matplotlib, pandas, cython тощо), працюють переважно під CPython, тому в цьому випадку найкращим варіантом є pythonnet (інші назви - Python.NET та Python для .NET). Те саме стосується прив'язок графічного інтерфейсу CPython, таких як WxWidgets, PyQt / PySide, GTK, Kivy тощо, хоча і pythonnet, і IronPython можуть використовувати WPF та WinForms.

І нарешті IronPython ще не повністю підтримує Python 3.


9

IronPython є ".NET-рідною" - тому буде переважно, якщо ви хочете повністю інтегрувати свій код Python із .NET до кінця; Python.NET працює з класичним Python, тому він дозволяє вам тримати "віддалену руку" вашого коду Python від власного .NET. (Зверніть увагу, що за допомогою цього коду ви можете використовувати розширення, написані для CPython із вашого коду IronPython, тому це вже не є дискримінаційною умовою).


6

IronPython походить від корпорації Майкрософт, тому я хотів би взяти його з кишечником і спочатку використовувати його, оскільки ви повинні припустити, що він буде краще працювати з іншими технологіями MSFT.


Я сумніваюся в цьому, оскільки воно не є частиною vs20xx
user3800527

4

Що стосується 2016 року.

У моїй компанії ми використовували IronPython, але нас не влаштовували показники (переважно використання пам'яті - збирач сміття був занадто повільним), тому ми вирішили перейти на стандартний Python та інтегрувати його з .Net за допомогою Zeroce-s ICE.


Я здивований, що RPC між різними процесами було обрано з міркувань продуктивності. Швидше за все CPython + .NET, що використовує pythonnet в тому ж процесі, повинен бути швидшим, ніж цей підхід. Що стосується Zeroce ICE, зверніть увагу, що він має ліцензію GPL і тому не дуже підходить для комерційних застосувань.
denfromufa

Цікаве рішення, дякую. Що стосується ліцензування, для ICE існує комерційний варіант: zeroc.com/licensing
Atorian


1
  1. Ironpython схожий на C #, у свою чергу, він покладається на статичні попередньо побудовані бібліотеки, тоді як на відміну від C # є динамічною мовою.

  2. Cpython схожий на C ++, як Ironpython - це динамічна мова і має доступ до динамічних бібліотек, що, в свою чергу, перетворюється на примус до написання всього.

  3. Ironpython швидше, ніж C #, у певних областях, але не швидше, ніж Cpython, однак ви можете зв’язати Ironpython з будь-якою мовою, таким чином, над майбутніми проблемами, але знову ж ви можете зробити те ж саме з Cpython.

Смішна, проста і потужна мова, незалежно від того, що ви вибрали!


1

Залізний Python - це, в основному, Python 2.7 з інтегрованою підтримкою .net, імовірно, він ніколи не підтримуватиме Python 3. Він програє бібліотекам C та Python, однак на повороті має доступ до .net і може бути розширений за допомогою C #. Отже, якщо ви вже використовуєте C #, тоді Iron Python - бонус.


-1

Я переважно віддаю перевагу Python для .NET, тому що IronPython компілюється як керований код, який можна легко декомпілювати (що я найбільше ненавиджу), але за допомогою py2exe або pyinstaller ви можете скомпілювати Python з модулем NET як некеровану програму.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.