ctypes vs C扩展

时间:2011-11-09 15:21:21

标签: python c ctypes overhead

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

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


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

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

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:7)

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

当然,这完全取决于您正在调用的函数类型以及您传递的数据类型。可能你不能减少开销,在这种情况下,我仍然希望ctypes更慢,但可能不是很明显。

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