25

我有一些用 C 语言编写的用于游戏项目的函数。这些函数被调用很多次(大约每秒 2000-4000 次)。这些函数是用 C 语言编写的,以实现原始速度。

现在,对我来说将这些函数包含到 Python 中的最简单方法是使用ctypes. 另一种方法是围绕这些函数编写 Python 的 C 扩展(这需要相当多的额外工作)。所以我想知道,不包括 DLL 的初始加载,开销有多大ctypes


我正在使用 Python 2.7(标准 CPython 版本),我不想使用像 Cython 这样的外部库。

我知道之前有人问过这个问题,但是我没有看到太多关于两个选项之间的性能比较的信息。

4

2 回答 2

18

我比较了 C 扩展与 ctypes 包装器的性能。在我的特定测试中,差异约为 250 倍。对 C 库进行了多次调用,因此 ctypes 包装器也在执行 Python 代码。C 库的运行时间非常短,这使得 Python 代码的额外开销更加显着。所以这个比例对你来说可能会有所不同,但对我来说很重要。

于 2011-11-09T17:42:08.210 回答
9

直接 C 编码的接口有可能会快得多。瓶颈是从 Python 到 C 的接口,并且编组参数和结果可能涉及例如复制字符串或将 Python 列表转换为 C 数组/从 C 数组转换。如果您有一个循环进行数百次这样的调用,并且不必为每个调用单独编组一些数据,那么您所要做的就是在 C 中重新编码循环,您就可以大大减少瓶颈. ctypes 没有给你这个选项:你所能做的就是直接调用现有的函数。

当然,这完全取决于您调用的函数类型以及传递的数据类型。可能是您无法减少开销,在这种情况下,我仍然希望 ctypes 速度较慢,但​​可能不会显着。

最好的办法是将每种方式编写的代码示例放在一起并对其进行基准测试。否则,有太多变量无法给出明确的答案。

于 2011-11-09T15:36:38.463 回答