python - 使用 Python/C 接口(interface)而不是 Cython 是否有优势?

标签 python c numpy cython

我想通过使用 BLAS 和 LAPACK 用 C 或 C++ 编写一些模块来扩展 python 和 numpy。我还希望能够将代码作为独立的 C/C++ 库分发。我希望这个库同时使用单精度和 double float 。我将编写的一些函数示例是用于求解线性系统的共轭梯度或加速的一阶方法。有些函数需要从 C/C++ 代码中调用 Python 函数。

在玩了一点 Python/C API 和 Numpy/C API 之后,我发现很多人提倡使用 Cython 来代替(参见例如 this questionthis one )。我不是关于 Cython 的专家,但似乎对于 some cases ,你仍然需要使用 Numpy/C API 并知道它是如何工作的。鉴于我已经对 Python/C API 有(一些)知识而对 Cython 一无所知,我想知道继续使用 Python/C API 是否有意义,以及使用这个 API 是否比 Cython 有一些优势.以后我肯定会开发一些不涉及数值计算的东西,所以这个问题不仅仅是关于numpy的。我喜欢 Python/C API 的一件事是我了解了一些有关 Python 解释器工作原理的知识。

谢谢。

最佳答案

当前的“最佳答案”在我耳中听起来有点像 FUD。一方面,普通开发人员用 C 编写的代码比 NumPy+Cython 给你的代码更快并不是很明显。恰恰相反,将必要的 C 代码在 Python 环境中正常工作所花费的时间通常更好地投资于在 Cython 中编写快速原型(prototype)、对其进行基准测试、对其进行优化、以更快的方式重写它、对其进行基准测试再次,然后决定其中是否有任何东西真正需要提高 5-10% 的性能,你可能会或可能不会通过用手动调整的 C 重写 2% 的代码并调用它来获得来自您的 Cython 代码。

我正在用 Cython 编写一个库,目前有大约 18K 行 Cython 代码,转换为近 200K 行 C 代码。通过在正确的位置注入(inject)大约 20 行手动调整的 C 代码,我曾经设法将几个非常重要的内部基础级函数的速度提高了近 25%。我花了几个小时来重写和优化这个小部分。与我一开始不使用纯 C 语言编写(并且必须维护)库所节省的大量时间相比,这真的不算什么。

即使你比 Cython 更了解 C,如果你了解 Python C,你会很快学会 Cython,在任何情况下都值得投资,尤其是当你研究数字时。您编写的 80-95% 的代码将从使用高级语言编写中受益匪浅,因此您可以放心地放手,将节省的一半时间投入到编写代码的速度上,就像您编写代码一样快立即使用低级语言。

话虽如此,您希望“能够将代码作为独立的 C/C++ 库分发”的评论是坚持使用纯 C/C++ 的正当理由。 Cython 总是依赖于 CPython,这是一个相当依赖的地方。但是,使用纯 C/C++(Python 接口(interface)除外)也不允许您利用 NumPy,因为这也取决于 CPython。因此,像往常一样,在用 C 编写东西时,您必须先做很多基础工作,然后才能使用实际功能。在开始这项工作之前,您应该认真考虑一下。

关于python - 使用 Python/C 接口(interface)而不是 Cython 是否有优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5720272/

相关文章:

c - 流程层次结构

python ndarray 在特定索引处执行 A[ :, ... , l, .. :]

c# - python:math.sqrt(x) 函数有多准确?

python - 如何限制运行脚本的权限?

python - 如何使 2 个列表相互对应?

python - 数据类型传输/转换

python - 如何有效地改变数组中一定数量的值?

Python 如何获取设置位

c - 如何缩短这个?有办法吗?

c - 了解声明 C 字符串的两种方式