ctypes与C扩展

27 投票
2 回答
8753 浏览
提问于 2025-04-17 05:57

我有几个用C语言写的函数,主要是为了一个游戏项目。这些函数调用的频率非常高,大约每秒会被调用2000到4000次。为了追求速度,这些函数是用C语言编写的。

现在,我想把这些函数放到Python里,最简单的方法就是用ctypes。另外一种方法是为这些函数写一个C语言扩展,这样做会比较麻烦,需要花费更多的时间和精力。所以我想知道,除了最开始加载DLL的时间,使用ctypes的开销有多大?


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

我知道这个问题之前有人问过,但我没有看到关于这两种方法性能比较的详细信息。

2 个回答

9

直接用C语言编写的接口可能会快很多很多。瓶颈在于Python和C之间的接口,传递参数和结果可能需要复制字符串或者把Python的列表转换成C的数组。如果你有一个循环需要调用几百次这些函数,而有些数据不需要每次都单独处理,那么你只需要把这个循环用C语言重写,就能大大减少瓶颈。使用ctypes的话,你就没有这个选择:你只能直接调用现有的函数。

当然,这一切都取决于你调用的函数类型和你传递的数据类型。可能你无法减少开销,这样的话我还是觉得ctypes会慢一些,但可能不会慢得太多。

最好的办法是把你的代码用不同的方式写几个样本,然后进行性能测试。否则,变量太多,没法给出一个明确的答案。

18

我对比了C语言扩展和ctypes封装的性能。在我的测试中,二者的差距大约是250倍。因为我多次调用了C语言库,所以ctypes封装也在执行Python代码。C语言库的运行时间非常短,这让Python代码的额外开销显得更加明显。所以你可能会得到不同的比例,但在我的情况下,这个差距是很大的。

撰写回答