Cython 与 Python.h 扩展 C/C++ 等之间的差异

Differences between Cython, extending C/C++ with Python.h, etc

现在我有一个大约 100 行左右的图像处理算法 Python。使用 numpyPILscipy 大约需要 500 毫秒。我希望更快地获得它,并且由于实际算法到目前为止似乎已经非常优化,我想知道使用 Cython 等不同的方法是否会缩短时间。我相信我可以做几件不同的事情:

  1. 使用 Cython 将 C 库的相关部分暴露给 Python。
  2. 使用 Ctypes 只用 C 编写所有内容,但仍然保持纯正 Python(完全不倾向于此)
  3. 在 C/C++ 中创建一个扩展模块,然后他们将其导入并调用函数。不过,我不确定我是否能够以这种方式使用 numpy
  4. 创建 DLL 并 Python 加载它。这不会使用 numpy 或那些模块,但仍然非常有效。

我这里只是追求速度,并不担心实现的难度。在这种情况下有没有更好的选择,它们都是一样的,还是值得做的?

了解您需要在此处做什么会很有帮助。

如果您不使用 ctypes 进行函数调用,那么只涉及 ctypes 类型不太可能为您节省任何费用。如果您已经有一些带有 "solve it for me" 函数的 DLL,那么当然,ctypes 就是。

Cython 创建扩展模块,因此您可以使用 Cython 做的任何事情也可以使用扩展模块来完成,这仅取决于您手工编写扩展的舒适程度。 Cython 比手工编写扩展更受限制,更难 "see" 性能(优化 Cython 的规则基本上与优化 CPython 代码相反,如果你忘记 cdef正确的事情,你一无所获),但 Cython 通常也更简单。

只有当您有非Python用途时,才值得编写一个单独的非扩展 DLL;否则,Python 扩展基本上只是 DLL 的情况,但更好地集成。

基本上,根据定义,如果有无限的时间和技能,CPython 扩展将在性能上击败任何其他选项,因为它可以完成其他选项所做的一切,甚至更多。只是工作量更大,而且容易出错(因为你写的是 C,容易出错)。