IronPython与Python .NET

csc*_*hol 80 .net python ironpython cpython python.net

我想从Python代码访问一些用C#编写的.NET程序集.

一点研究表明我有两个选择:

两种解决方案之间的权衡取舍是什么?

Ree*_*sey 68

如果你想主要基于.NET框架的代码,我强烈推荐IronPython与Python.NET.IronPython几乎是原生.NET - 所以它在与其他.NET语言集成时效果很好.

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

使用IronPython时存在显着差异 - 但大多数都相当微妙.Python.NET使用标准的CPython运行时,因此这个Wiki页面是对两个实现之间差异的相关讨论.最大的差异出现在异常成本上 - 因此一些标准的python库由于其实现而在IronPython中表现不佳.

  • IronPython现在有"轻量级"异常,速度要快得多.来自PyBench的TryRaiseExcept测试执行速度慢了60倍,现在只慢了1.6倍.WithRaiseExcept仍然很慢,但比以前快4倍.对于大多数其他测试,IPy实际上是*更快*.[**IronPython 2.7 vs CPython 2.7性能比较**](http://ironpython.codeplex.com/wikipage?title=IP27A1VsCPy27Perf)(完整[基准列表](http://ironpython.codeplex.com/wikipage?标题= IronPython的%20Performance)). (11认同)

Vin*_*jip 28

在同意Reed Copsey和Alex Martelli给出的答案时,我想指出另一个不同之处 - 全球翻译锁(GIL).虽然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功能从Python API,以及这些API的文档适用于管理的版本.

另一个问题是IDE支持.CPython目前可能比IronPython有更好的IDE支持 - 所以这可能是选择其中一个的一个因素.

  • PyDev Eclipse插件支持CPython,IronPython和Jython. (4认同)
  • @Knut:是的,但这不是我写这个答案时的情况. (3认同)

den*_*ufa 18

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

最后IronPython还没有完全支持Python 3.


Ale*_*lli 9

IronPython是".NET原生的" - 所以如果你想要将Python代码与.NET完全集成在一起,那将是更好的选择.Python.NET可以与Classic Python一起使用,因此它可以让你保持Python代码的"臂长"远离.NET.(注意,使用此代码,您实际上可以使用从IronPython代码为CPython编写的扩展,因此这不再是一个区别条件).


i_a*_*orf 6

IronPython来自微软,所以我会尽我所能并首先使用它,因为你不得不假设它会与其他MSFT技术相比更好.


top*_*olm 5

至于2016年。

在我的公司中,我们使用 IronPython,但我们对性能不满意(主要是内存使用 - 垃圾收集器太慢),因此我们决定切换到标准 Python 并使用 Zeroce-s ICE 将其与 .Net 集成。