2009-07-23 6 views
68

Я хочу получить доступ к некоторым сборкам .NET, написанным на C#, из кода Python.IronPython vs. Python .NET

Небольшое исследование показало, у меня есть два варианта:

  • IronPython с возможностью .NET интерфейс/поддержка встроенного
  • Python с Python .NET пакета

Какие компромиссы между обоими решениями?

ответ

61

Если вы хотите в основном основывать свой код на платформе .NET, я бы настоятельно рекомендовал IronPython vs Python.NET. IronPython в значительной степени является родным .NET - поэтому он отлично работает при интеграции с другими .NET langauges.

Python.NET хорош, если вы хотите просто интегрировать один или два компонента из .NET в стандартное приложение python.

Заметные отличия при использовании IronPython - но большинство из них довольно тонкие. Python.NET использует стандартную среду исполнения CPython, поэтому this Wiki page - это соответствующее обсуждение различий между двумя реализациями. Наибольшие различия возникают в стоимости исключений - поэтому некоторые из стандартных библиотек python не работают также в IronPython из-за их реализации.

+10

У IronPython есть «легкие» исключения, которые теперь намного быстрее. Тест TryRaiseExcept от PyBench, который выполнялся в 60 раз медленнее, теперь только в 1,6 раза медленнее. WithRaiseExcept все еще медленный, но в 4 раза быстрее, чем раньше. Для большинства других тестов IPy на самом деле * быстрее *. [** Сравнение IronPython 2.7 с сопоставлением производительности CPython 2.7 **) (http://ironpython.codeplex.com/wikipage?title=IP27A1VsCPy27Perf) (полный [список тестов] (http://ironpython.codeplex.com/wikipage? название = IronPython% 20Performance)). – Athari

7

IronPython является «.NET-native» - поэтому будет предпочтительным, если вы хотите полностью интегрировать свой код Python с .NET на всем пути; Python.NET работает с классическим Python, поэтому он позволяет вам держать «длину руки» на Python в стороне от .NET. (Обратите внимание, что с помощью this code вы можете использовать расширения, написанные для CPython, из вашего кода IronPython, так что это уже не дискриминационное условие).

7

IronPython поставляется с Microsoft, поэтому я поеду с моей кишкой и первым использую этот первый, так как вы должны предположить, что он будет играть лучше с другими технологиями MSFT.

+0

Я сомневаюсь в этом, так как его не часть vs20xx – user3800527

26

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

Из документации Python.NET:

Важное примечание для: для внедрения Python не свободно нарезкой и использует глобальную блокировку интерпретатора, чтобы многопоточные приложения к взаимодействуют безопасно интерпретатор Python . Гораздо больше информации об этом можно найти в документации на 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.

В AcquireLock и ReleaseLock методов представляют собой тонкие упаковщики над неуправляемого PyGILState_Ensure и PyGILState_Release функциями из Python API и документация для этих API, относится к управляемым версии.

Еще одна проблема - поддержка IDE. В настоящее время CPython имеет лучшую поддержку IDE, чем IronPython, поэтому это может быть фактором выбора одного из них.

+4

Плагин PyDev Eclipse поддерживает CPython, IronPython и Jython. –

+3

@ Knut: Правильно, но это было не так, когда я написал этот ответ. –

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

  2. Cpython похож на C++, так как Ironpython является динамическим языком и имеет доступ к динамическим библиотекам, что, в свою очередь, переводится как вынужденное писать все.

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

Смешной, простой и мощный язык независимо от того, что вы выберете!

11

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

И, наконец, IronPython не поддерживает полностью Python 3.

2

Что касается 2016 года

В моей компании мы использовали IronPython, но мы не были удовлетворены с действиями (в основном, использование памяти - сборщик мусора слишком медленно), поэтому мы решили переключиться на стандартный Python и интегрировать его с. Сеть с использованием ICE Zeroce.

+0

Я удивлен, что RPC между различными процессами был выбран по соображениям производительности. Скорее всего, CPython + .NET с использованием pythonnet в том же процессе должен быть быстрее, чем этот подход. Что касается Zeroce ICE, обратите внимание, что он лицензирован GPL и поэтому не очень подходит для коммерческих приложений. – denfromufa

+0

Интересное решение, спасибо. Что касается лицензирования, для ICE существует коммерческий вариант: https://zeroc.com/licensing – Atorian

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^