从C扩展调用Python函数的速度成本
我正在写一个程序,目的是模拟几个不同变量的进化路径。大部分程序是用Python写的,但为了提高速度,我正在用C语言写一些模拟循环的代码(大约15000个循环)。不过,我还是想利用Numpy的随机数生成器(在这里)。我知道我可以在我的扩展中调用Python的函数,但这样会不会让C语言的循环变慢,从而失去写这个扩展的意义呢?
1 个回答
2
当你从C扩展中调用Python函数时,会有几个额外的开销:
- 你想传给Python函数的C变量需要被包装成Python对象。这一步的开销和你直接在Python中创建这些对象差不多。
- 需要调用Python函数。这一步的开销和正常的Python函数调用一样。
- 返回值需要从Python对象中解包到C中,同时Python的值会被垃圾回收。这一步的开销也差不多和正常的Python返回值超出作用域时一样。
要判断这样做是否值得,主要看你在C中写了多少代码,以及能避免多少Python对象的操作。如果你在C中只有一个简单的for
循环去调用Python函数,那可能就不太划算。如果你在C中做了很多数据处理,这些处理可以在C中完成,那么即使你在某个地方调用了Python函数,你也能节省不少开销。
不过,最快的方式可能是使用numpy的C API,直接从C中调用numpy函数。这样可以避免大部分开销,因为你不需要把所有参数都包装成Python对象,同时还能继续使用numpy的功能。