IronPython so với Python .NET


88

Tôi muốn truy cập một số hội đồng .NET được viết bằng C # từ mã Python.

Một nghiên cứu nhỏ cho thấy tôi có hai lựa chọn:

  • IronPython với khả năng / hỗ trợ giao diện .NET tích hợp sẵn
  • Python với gói Python .NET

Sự đánh đổi giữa cả hai giải pháp là gì?

Câu trả lời:


71

Nếu bạn muốn chủ yếu dựa trên mã của mình trên .NET framework, tôi thực sự khuyên bạn nên sử dụng IronPython vs Python.NET. IronPython có khá nhiều .NET gốc - vì vậy nó chỉ hoạt động tốt khi tích hợp với các ngôn ngữ .NET khác.

Python.NET rất tốt nếu bạn chỉ muốn tích hợp một hoặc hai thành phần từ .NET vào một ứng dụng python tiêu chuẩn.

Có những khác biệt đáng chú ý khi sử dụng IronPython - nhưng hầu hết chúng đều khá tinh tế. Python.NET sử dụng thời gian chạy CPython tiêu chuẩn, vì vậy trang Wiki này là một cuộc thảo luận có liên quan về sự khác biệt giữa hai cách triển khai. Sự khác biệt lớn nhất xảy ra trong chi phí ngoại lệ - vì vậy một số thư viện python tiêu chuẩn không hoạt động tốt trong IronPython do việc triển khai chúng.


11
IronPython hiện có các ngoại lệ "nhẹ" và nhanh hơn nhiều. Một thử nghiệm TryRaiseExcept từ PyBench hoạt động chậm hơn 60 lần, giờ chỉ chậm hơn 1,6 lần. WithRaiseExcept vẫn còn chậm, nhưng nhanh hơn 4 lần so với trước đây. Đối với hầu hết các thử nghiệm khác, IPy thực sự nhanh hơn . So sánh hiệu suất IronPython 2.7 và CPython 2.7 ( danh sách đầy đủ các điểm chuẩn ).
Athari

29

Trong khi đồng ý với các câu trả lời của Reed Copsey và Alex Martelli, tôi muốn chỉ ra một điểm khác biệt nữa - Khóa phiên dịch toàn cầu (GIL). Mặc dù IronPython không có những hạn chế của GIL, nhưng CPython thì có - vì vậy có vẻ như đối với những ứng dụng mà GIL là nút cổ chai, chẳng hạn như trong một số tình huống đa lõi, IronPython có lợi thế hơn Python.NET.

Từ tài liệu Python.NET:

Lưu ý quan trọng đối với trình nhúng: Python không phân luồng tự do và sử dụng khóa thông dịch toàn cục để cho phép các ứng dụng đa luồng tương tác an toàn với trình thông dịch Python. Nhiều thông tin hơn về điều này có sẵn trong tài liệu API Python C trên www.python.orgTrang web.

Khi nhúng Python vào một ứng dụng được quản lý, bạn phải quản lý GIL giống như cách bạn làm khi nhúng Python vào ứng dụng C hoặc C ++.

Trước khi tương tác với bất kỳ đối tượng hoặc API nào được cung cấp bởi Python.Runtimekhông gian tên, mã gọi phải có được khóa thông dịch toàn cầu Python bằng cách gọi PythonEngine.AcquireLockphương thức. Ngoại lệ duy nhất cho quy tắc này là PythonEngine.Initializephương thức, có thể được gọi khi khởi động mà không cần lấy GIL.

Khi hoàn tất việc sử dụng các API Python, mã được quản lý phải gọi một mã tương ứng PythonEngine.ReleaseLockđể giải phóng GIL và cho phép các luồng khác sử dụng Python.

Các AcquireLockReleaseLock phương thức là những trình bao bọc mỏng đối với các chức năng PyGILState_Ensurevà không được quản lý PyGILState_Releasetừ API Python và tài liệu cho các API đó áp dụng cho các phiên bản được quản lý.

Một vấn đề khác là hỗ trợ IDE. Hiện tại CPython có thể hỗ trợ IDE tốt hơn IronPython - vì vậy đây có thể là một yếu tố trong việc lựa chọn cái này hơn cái kia.


4
Plugin PyDev Eclipse hỗ trợ CPython, IronPython và Jython.
Knut Eldhuset

3
@Knut: Đúng, nhưng đó không phải là tình huống khi tôi viết câu trả lời này.
Vinay Sajip

18

Hầu hết các thư viện Python số và khoa học dựa trên CPython C-API (numpy, scipy, matplotlib, pandas, cython, v.v.) đang hoạt động chủ yếu dưới CPython, vì vậy trong trường hợp đó, lựa chọn tốt nhất của bạn là pythonnet (các tên khác - Python.NET và Python cho .NET). Điều này cũng đúng với các ràng buộc CPython GUI như WxWidgets, PyQt / PySide, GTK, Kivy, v.v., mặc dù cả pythonnet và IronPython đều có thể sử dụng WPF và WinForms.

Và cuối cùng thì IronPython vẫn chưa hỗ trợ đầy đủ Python 3.


9

IronPython là ".NET-native" - ​​vì vậy sẽ tốt hơn nếu bạn muốn tích hợp toàn bộ mã Python của mình với .NET; Python.NET hoạt động với Python cổ điển, vì vậy nó cho phép bạn giữ "độ dài cánh tay" của mã Python của bạn cách xa .NET thích hợp. (Lưu ý rằng với mã này, bạn thực sự có thể sử dụng các phần mở rộng được viết cho CPython từ mã IronPython của bạn, vì vậy đó không phải là một điều kiện phân biệt nữa).


6

IronPython đến từ Microsoft, vì vậy tôi sẽ sử dụng nó trước tiên vì bạn phải cho rằng nó sẽ chơi đẹp hơn với các công nghệ MSFT khác.


tôi nghi ngờ này kể từ khi nó không nằm trong vs20xx
user3800527

4

Đối với năm 2016.

Trong công ty của tôi, chúng tôi đã sử dụng IronPython, nhưng chúng tôi không hài lòng với hiệu suất (chủ yếu là sử dụng bộ nhớ - bộ thu gom rác quá chậm) vì vậy chúng tôi quyết định chuyển sang Python tiêu chuẩn và tích hợp nó với .Net bằng Zeroce-s ICE.


Tôi ngạc nhiên rằng RPC giữa các quy trình khác nhau được chọn vì lý do hiệu suất. Nhiều khả năng CPython + .NET sử dụng pythonnet trong cùng một quy trình sẽ nhanh hơn cách tiếp cận này. Đối với Zeroce ICE lưu ý rằng nó được cấp phép GPL và do đó không phù hợp lắm cho các ứng dụng thương mại.
denfromufa

Một giải pháp thú vị, cảm ơn. Đối với cấp phép, có một tùy chọn cho thương mại ICE: zeroc.com/licensing
Atorian


1
  1. Ironpython giống như C # đến lượt nó dựa trên các thư viện tĩnh được tạo sẵn trong khi không giống như C # là một ngôn ngữ động.

  2. Cpython giống như C ++ như Ironpython là một ngôn ngữ động và có quyền truy cập vào các thư viện động, do đó có nghĩa là buộc phải viết mọi thứ.

  3. Ironpython nhanh hơn C # trong một số lĩnh vực nhất định nhưng không nhanh hơn Cpython, tuy nhiên bạn có thể liên kết Ironpython với bất kỳ ngôn ngữ nào do đó trong các vấn đề sắp xảy ra nhưng một lần nữa bạn có thể làm tương tự với Cpython.

Một ngôn ngữ hài hước, đơn giản và mạnh mẽ bất kể bạn chọn gì!


1

Iron Python về cơ bản là Python 2.7 với hỗ trợ .net tích hợp, nó có thể sẽ không bao giờ hỗ trợ Python 3. Nó thua thiệt trên các thư viện C và Python, tuy nhiên về mặt xoắn có quyền truy cập vào .net và có thể được mở rộng bằng C #. Vì vậy, nếu bạn đã sử dụng C # thì Iron Python là một phần thưởng.


-1

Tôi chủ yếu thích Python cho .NET, vì IronPython được biên dịch dưới dạng mã được quản lý, có thể dễ dàng dịch ngược (điều tôi ghét nhất), nhưng với py2exe hoặc pyinstaller, bạn có thể biên dịch Python với mô-đun NET như một ứng dụng không được quản lý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.