IronPython 대 Python .NET


88

Python 코드에서 C #으로 작성된 일부 .NET 어셈블리에 액세스하고 싶습니다.

약간의 조사에 따르면 두 가지 선택이 있습니다.

  • .NET 인터페이스 기능 / 지원이 내장 된 IronPython
  • Python .NET 패키지 가있는 Python

두 솔루션 간의 장단점은 무엇입니까?

답변:


71

주로 .NET 프레임 워크를 기반으로하는 코드를 원한다면 IronPython 대 Python.NET을 적극 권장합니다. IronPython은 거의 기본 .NET이므로 다른 .NET 언어와 통합 할 때 훌륭하게 작동합니다.

Python.NET은 .NET의 하나 또는 두 개의 구성 요소를 표준 Python 응용 프로그램에 통합하려는 경우 유용합니다.

IronPython을 사용할 때 눈에 띄는 차이점이 있지만 대부분은 상당히 미묘합니다. Python.NET은 표준 CPython 런타임을 사용하므로이 Wiki 페이지 는 두 구현 간의 차이점에 대한 관련 토론입니다. 가장 큰 차이는 예외 비용에서 발생합니다. 따라서 일부 표준 Python 라이브러리는 구현으로 인해 IronPython에서 제대로 작동하지 않습니다.


11
IronPython에는 훨씬 더 빠른 "경량"예외가 있습니다. 60 배 더 느리게 수행 된 PyBench의 TryRaiseExcept 테스트는 이제 1.6 배 더 느립니다. WithRaiseExcept는 여전히 느리지 만 이전보다 4 배 더 빠릅니다. 대부분의 다른 테스트에서 IPy는 실제로 더 빠릅니다 . IronPython 2.7과 CPython 2.7 성능 비교 (전체 벤치 마크 목록 ).
Athari 2013 년

29

Reed Copsey와 Alex Martelli가 제공 한 답변에 동의하면서 GIL (Global Interpreter Lock)이라는 또 다른 차이점을 지적하고 싶습니다. IronPython에는 GIL의 제한이 없지만 CPython은 그렇습니다. 따라서 특정 멀티 코어 시나리오에서와 같이 GIL이 병목 현상이있는 애플리케이션의 경우 IronPython이 Python.NET보다 유리한 것으로 보입니다.

Python.NET 문서에서 :

임 베더에 대한 중요 참고 사항 : Python은 자유 스레드가 아니며 전역 인터프리터 잠금을 사용하여 다중 스레드 응용 프로그램이 Python 인터프리터와 안전하게 상호 작용할 수 있도록합니다. 이에 대한 더 많은 정보는 www.python.org웹 사이트 의 Python C API 문서에서 확인할 수 있습니다 .

관리되는 애플리케이션에 Python을 포함 할 때 C 또는 C ++ 애플리케이션에 Python을 포함 할 때와 동일한 방식으로 GIL을 관리해야합니다.

Python.Runtime네임 스페이스에서 제공하는 객체 또는 API와 상호 작용하기 전에 호출 코드가 PythonEngine.AcquireLock메서드 를 호출하여 Python 전역 인터프리터 잠금을 획득해야합니다 . 이 규칙의 유일한 예외 PythonEngine.Initialize는 GIL을 획득하지 않고 시작할 때 호출 할 수 있는 메서드입니다.

Python API 사용이 끝나면 관리 코드는 해당하는 PythonEngine.ReleaseLock을 호출 하여 GIL을 릴리스하고 다른 스레드가 Python을 사용하도록 허용 해야합니다 .

AcquireLockReleaseLock 방법은 관리되지 않는 이상 얇은 래퍼 PyGILState_EnsurePyGILState_Release파이썬 API의 기능 및 그 API에 대한 문서는 관리 버전에 적용됩니다.

또 다른 문제는 IDE 지원입니다. CPython은 현재 IronPython보다 더 나은 IDE 지원을 제공 할 것입니다. 따라서 이것이 다른 하나를 선택하는 요인이 될 수 있습니다.


4
PyDev Eclipse 플러그인은 CPython, IronPython 및 Jython을 지원합니다.
Knut Eldhuset 2010

3
@Knut : 맞아요.하지만 제가이 답변을 썼을 때는 상황이 아니 었습니다.
Vinay Sajip 2010

18

CPython C-API (numpy, scipy, matplotlib, pandas, cython 등)에 의존하는 대부분의 과학 및 숫자 Python 라이브러리는 대부분 CPython에서 작동하므로이 경우 가장 좋은 방법은 pythonnet (다른 이름-Python.NET)입니다. 및 .NET 용 Python). pythonnet과 IronPython 모두 WPF 및 WinForms를 사용할 수 있지만 WxWidgets, PyQt / PySide, GTK, Kivy 등과 같은 CPython GUI 바인딩도 마찬가지입니다.

마지막으로 IronPython은 아직 Python 3을 완전히 지원하지 않습니다.


9

IronPython은 ".NET 네이티브"이므로 Python 코드를 .NET과 완전히 통합하려는 경우 선호됩니다. Python.NET은 클래식 Python과 함께 작동하므로 Python 코드의 "팔 길이"를 .NET에서 적절하게 유지할 수 있습니다. ( 이 코드 를 사용하면 IronPython 코드에서 CPython 용으로 작성된 확장을 실제로 사용할 수 있으므로 더 이상 차별 조건이 아닙니다.)


6

IronPython은 Microsoft에서 제공하므로 다른 MSFT 기술과 더 잘 작동 할 것이라고 가정해야하므로 내 직감을 가지고 먼저 사용하겠습니다.


내가 vs20xx의 그것의 일부가 아닌 이후이 의심
user3800527

4

2016 년.

우리 회사에서는 IronPython을 사용했지만 성능에 만족하지 않았기 때문에 (주로 메모리 사용-가비지 수집기가 너무 느림) 표준 Python으로 전환하고 Zeroce-s ICE를 사용하여 .Net과 통합하기로 결정했습니다.


성능상의 이유로 서로 다른 프로세스 간의 RPC가 선택되었다는 사실에 놀랐습니다. 동일한 프로세스에서 pythonnet을 사용하는 CPython + .NET이이 접근 방식보다 빠를 가능성이 높습니다. Zeroce ICE의 경우 GPL 라이센스가 있으므로 상업용 애플리케이션에는 적합하지 않습니다.
denfromufa

흥미로운 해결책입니다. 감사합니다. 라이센싱에 관해서는 ICE에 대한 상업적 옵션이 있습니다 : zeroc.com/licensing
Atorian


1
  1. Ironpython은 C #과 비슷하지만 C #은 동적 언어와 달리 사전 빌드 된 정적 라이브러리에 의존합니다.

  2. Cpython은 Ironpython이 동적 언어이고 동적 라이브러리에 액세스 할 수있는 것처럼 C ++과 유사합니다. 이는 결국 모든 것을 작성하도록 강제됩니다.

  3. Ironpython은 특정 영역에서 C #보다 빠르지 만 Cpython보다 빠르지는 않지만 Ironpython을 모든 언어에 연결할 수 있으므로 다가오는 문제를 해결할 수 있지만 다시 Cpython으로 동일한 작업을 수행 할 수 있습니다.

무엇을 선택하든 재미 있고 간단하며 강력한 언어!


1

Iron Python은 기본적으로 통합 된 .net 지원이 포함 된 Python 2.7입니다. 아마도 Python 3을 지원하지 않을 것입니다. C 및 Python 라이브러리에서 손실되지만, 트위스트 측면에서는 .net에 액세스 할 수 있으며 C #으로 확장 할 수 있습니다. 따라서 이미 C #을 사용하고 있다면 Iron Python은 보너스입니다.


-1

IronPython은 쉽게 디 컴파일 될 수있는 (내가 가장 싫어하는) 관리 코드로 컴파일되기 때문에 주로 .NET 용 Python을 선호하지만 py2exe 또는 pyinstaller를 사용하면 관리되지 않는 애플리케이션으로 NET 모듈을 사용하여 Python을 컴파일 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.