Cython 之间的差异,使用 Python.h 扩展 C/C++ 等

Chr*_*sso 5 python ctypes cython python-extensions

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

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

我只是在这里寻找速度,而不是担心实施的难度。在这种情况下,是否有更好的选择,它们都是一样的,还是值得做?

Sha*_*ger 6

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

如果您不使用ctypesfor 函数调用,那么它不太可能为您节省任何ctypes涉及类型的东西。如果您已经有一些带有“帮我解决它”功能的 DLL,那么肯定ctypes是这样。

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

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

基本上,根据定义,凭借无限的时间和技能,CPython 扩展将在性能方面击败任何其他选项,因为它可以完成其他人所做的一切,甚至更多。这只是更多的工作,并且容易出错(因为您正在编写 C,这很容易出错)。