IronPython与Python.NET哪个更好?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (226)

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

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

两种解决方案之间的折衷是什么?

提问于
用户回答回答于

如果你想主要将代码放在.NET框架上,我会强烈推荐IronPython和Python.NET。IronPython是非常原生的.NET - 所以它在与其他.NET语言集成时效果很好。

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

使用IronPython有显着的区别 - 但其中大部分都非常微妙。Python.NET使用标准的CPython运行时,所以这个Wiki页面是两个实现之间差异的相关讨论。异常成本最大的区别是 - 所以一些标准的python库在IronPython中的执行效果不佳。

用户回答回答于

我想指出一个区别 - 全球口译员锁(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支持 - 所以这可能是选择其中一个因素。

扫码关注云+社区

领取腾讯云代金券