使用Python / C接口代替Cython有优势吗?

| 我想通过使用BLAS和LAPACK在C或C ++中编写一些模块来扩展python和numpy。我还希望能够将代码作为独立的C / C ++库进行分发。我希望该库同时使用单精度和双精度浮点数。我将编写的函数示例包括用于求解线性系统或加速一阶方法的共轭梯度。一些函数将需要从C / C ++代码中调用Python函数。 在玩完Python / C API和Numpy / C API之后,我发现许多人提倡使用Cython(例如,请参阅此问题或该问题)。我不是Cython的专家,但是似乎在某些情况下,您仍然需要使用Numpy / C API并了解其工作原理。鉴于我已经对Python / C API有所了解,而对Cython却一无所知,我想知道继续使用Python / C API是否有意义,并且使用此API是否比Cython有优势。将来,我肯定会开发一些不涉及数值计算的东西,因此,这个问题不仅与numpy有关。我喜欢Python / C API的一件事是,我学到了一些有关Python解释器如何工作的知识。 谢谢。     
已邀请:
首先,您的问题有一点我不明白:   [...]还希望能够将代码作为独立的C / C ++库进行分发。 [...]一些函数将需要从C / C ++代码中调用Python函数。 这应该如何工作? 接下来,关于您的实际问题,直接使用Python / C API当然具有优势: 最有可能的是,您比编写Cython代码更熟悉C语言。 用C编写代码可以最大程度地控制您。要从Cython代码获得与等效C代码相同的性能,您必须非常小心。您不仅需要确保声明所有变量的类型,还必须适当设置一些标志-边界检查只是一个例子。您将需要深入了解Cython如何工作以获得最佳性能。 Cython代码取决于Python。编写应该作为Cython中的独立C库分发的代码似乎不是一个好主意     
当前的“最佳答案”听起来有点像FUD。举一个例子,普通开发人员用C编写的代码要比NumPy + Cython编写的代码要快得多,这并不立刻显而易见。恰恰相反,通常花费更好的时间来花费更多的时间来用Cython编写一个快速原型,对其进行基准测试,优化,以更快的方式重写,对其进行基准测试,这甚至花费了很多时间。再次,然后确定其中是否真正需要通过重写手动调整的C中2%的代码并从Cython代码中调用它来获得5-10%的性能。 我正在用Cython写一个库,目前有大约18K行的Cython代码,可以转换为近200K行的C代码。我曾经通过在正确的位置注入约20行经过手工调整的C代码,成功实现了几个非常重要的内部基本级别函数的速度提高了近25%。我花了几个小时来重写和优化这一小部分。与我一开始不使用普通C编写(并必须维护)库所节省的大量时间相比,这确实是什么。 即使您对C的了解比对Cython的了解要多得多,但如果您对Python和C的了解也是如此,那么您将很快学习Cython,因此在任何情况下都值得投资,尤其是当您使用数字时。使用高级语言编写代码,将使您编写的代码的80-95%受益匪浅,因此您可以安全地退回,并节省一半的时间,以使代码编写与编写代码一样快立即使用低级语言。 话虽如此,您希望“能够将代码作为独立的C / C ++库分发”的评论是坚持纯C / C ++的有效理由。 Cython始终依赖于CPython,这非常依赖。但是,使用普通的C / C ++(Python接口除外)也不会让您利用NumPy,因为这也取决于CPython。因此,像往常一样用C编写东西时,在获得实际功能之前,您必须做大量基础工作。在开始这项工作之前,您应该认真考虑这一点。     
Python / C API的主要缺点是,如果在内部循环中使用它,可能会非常慢。我看到调用Python函数比调用等效的C ++函数要多80-160倍。 如果那不打扰您的代码,那么您将受益于能够用Python编写一些代码块,可以访问Python库,支持直接用Python编写的回调。这也意味着您可以进行一些更改而无需重新编译,从而简化了原型制作。     

要回复问题请先登录注册