2011-11-09 95 views
14

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

现在,将这些函数包含到Python中的最简单方法是使用​​。另一种方法是围绕这些函数向Python写一个C扩展(这需要相当多的额外工作)。所以我想知道,不包括DLL的初始加载,​​的开销有多大?我使用Python 2.7(标准的CPython版本),我不想使用像Cython这样的外部库。

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

+0

那么,PyPy的JIT可以为一个或两个版本的'ctypes'调用产生相当不错的代码。你可能想尝试一下。我不会将此作为答案发布,因为我手头没有硬数据,目前尚不清楚是否可以为您提供切换解释器。 – delnan

+0

我希望开销类似。 –

+0

@Delnan:这是我要发布的游戏 - 也是针对linux的。我不能要求我的用户安装PyPy。 – orlp

回答

10

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

+5

那么哪一个是250x慢? – delnan

+1

@delnan:从他的回答中,我可以看到ctypes包装比较慢。 – orlp

6

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

当然,这一切都取决于您所调用的函数以及您传递的数据类型。这可能是你不能减少开销,在这种情况下,我仍然认为ctypes会变慢,但可能并不显着。

你最好的办法是把你的代码样本写在每个方面,并进行基准测试。否则,只有太多的变量才能给出明确的答案。

+0

我们所讨论的数据是一个位掩码(用于碰撞),我准备好了一个C实现,在Python代码中传递的数据是布尔值,坐标和新的python位掩码类(它只包含一个指向实际数据本身的指针,它存在于C代码中) – orlp