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

问题描述 投票:0回答:1

现在我有一个用Python编写的图像处理算法,大约有100行左右。使用

numpy
PIL
scipy
大约需要 500 毫秒。我希望更快地获得它,并且由于到目前为止实际算法似乎已经相当优化,我想知道使用不同的方法(例如
Cython
)是否会改善时间。我相信我可以做几件不同的事情:

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

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

python cython ctypes python-extensions
1个回答
9
投票

了解您需要在这里做什么会很有帮助。

如果您不使用

ctypes
进行函数调用,那么只涉及
ctypes
类型不太可能为您节省任何东西。如果您已经有一些带有“帮我解决”功能的 DLL/共享对象,那么当然,
ctypes
就是这样。

Cython 创建扩展模块,因此您可以使用 Cython 执行的任何操作也可以使用扩展模块完成,这仅取决于您手动编写扩展的舒适程度。 Cython 比手动编写扩展受到更多限制,并且更难“看到”性能(优化 Cython 的规则基本上与优化标准 Python 级 CPython 代码相反,如果您忘记

cdef
正确的事情,您没有任何收获;
cdef
错误的事情会让代码变慢),但 Cython 通常也更简单。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.