IronPython与Python .NET


Answers:


71

如果您想主要基于.NET框架编写代码,则强烈建议IronPython与Python.NET。IronPython几乎是.NET的本机-因此,与其他.NET语言集成时,它工作得很好。

如果您只想将.NET的一个或两个组件集成到标准python应用程序中,则Python.NET很好。

使用IronPython时,有明显的不同-但大多数都相当细微。Python.NET使用标准的CPython运行时,因此此Wiki页面是有关两种实现之间差异的相关讨论。最大的差异发生在异常的开销上-因此,由于其实现,某些标准的python库在IronPython中的性能不佳。


11
IronPython现在具有“轻量级”异常,速度更快。PyBench的TryRaiseExcept测试的速度慢了60倍,现在只慢了1.6倍。WithRaiseExcept仍然很慢,但是比以前快4倍。对于大多数其他测试,IPy实际上更快IronPython 2.7与CPython 2.7的性能比较基准的完整列表)。
阿萨里(Athari)

29

在同意里德·科普西(Reed Copsey)和亚历克斯·马特利(Alex Martelli)给出的答案的同时,我想指出另外一个区别-全球口译员锁定(GIL)。尽管IronPython不受GIL的限制,但CPython却具有-因此,对于那些以GIL为瓶颈的应用程序来说,似乎在某些多核方案中,IronPython优于Python.NET。

从Python.NET文档中:

嵌入程序的重要说明: Python不是自由线程的,并且使用全局解释器锁来允许多线程应用程序与Python解释器安全地交互。有关更多信息,请参阅www.python.org网站上的Python C API文档 。

将Python嵌入托管应用程序时,必须以与将Python嵌入C或C ++应用程序中相同的方式管理GIL。

在与Python.Runtime名称空间提供的任何对象或API进行交互之前 ,调用代码必须已通过调用PythonEngine.AcquireLock方法获得了Python全局解释器锁 。该规则的唯一例外是 PythonEngine.Initialize方法,该方法可以在启动时调用而无需获取GIL。

使用Python API完成使用后,托管代码必须调用相应的代码 PythonEngine.ReleaseLock以释放GIL并允许其他线程使用Python。

AcquireLockReleaseLock 方法是在非托管的瘦包装PyGILState_EnsurePyGILState_Release功能从Python API,以及这些API的文档适用于管理的版本。

另一个问题是IDE支持。CPython当前可能比IronPython具有更好的IDE支持-因此这可能是一个选择另一个的因素。


4
PyDev Eclipse插件支持CPython,IronPython和Jython。
Knut Eldhuset

3
@Knut:是的,但是我写这个答案的时候不是这种情况。
Vinay Sajip,2010年

18

大多数依赖CPython C-API的科学和数字Python库(numpy,scipy,matplotlib,pandas,cython等)大多在CPython下工作,因此在这种情况下,最好的选择是pythonnet(其他名称-Python.NET和适用于.NET的Python)。对于CPython GUI绑定(例如WxWidgets,PyQt / PySide,GTK,Kivy等),也是如此,尽管pythonnet和IronPython都可以使用WPF和WinForms。

最后,IronPython还不完全支持Python 3。


9

IronPython是“ .NET原生”的-因此,如果您希望将Python代码与.NET完全集成在一起,那将是更好的选择。Python.NET与经典Python一起使用,因此它使您可以远离.NET适当地保持Python代码的“正常长度”。(请注意,通过此代码,您实际上可以使用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 '16


1
  1. Ironpython就像C#一样,它依赖于静态的预构建库,而C#是一种动态语言。

  2. Cpython就像C ++一样,Ironpython是一种动态语言,可以访问动态库,而动态库又转化为被迫编写一切。

  3. Ironpython在某些方面比C#快,但不比Cpython快,但是您可以将Ironpython链接到任何语言,从而解决出现的问题,但是再次可以对Cpython进行同样的操作。

无论选择什么,都是一种有趣,简单而强大的语言!


1

Iron Python基本上是具有集成的.net支持的Python 2.7,它可能永远不会支持Python3。它在C和Python库中失传了,但是在另一方面,它可以访问.net并可以使用C#进行扩展。因此,如果您已经使用C#,那么Iron Python是一个加分项。


-1

我主要喜欢.NET的Python,因为IronPython被编译为托管代码,可以很容易地反编译(我最讨厌的),但是使用py2exe或pyinstaller,您可以将带有NET模块的Python编译为非托管应用程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.