从C扩展调用Python函数的速度成本

时间:2014-06-11 21:39:05

标签: python c numpy

我正在编写一个涉及模拟几个不同变量的演化路径的程序。程序的大部分是在Python中,但我正在为模拟循环(~15k)编写代码作为C扩展来提高速度。但是,我仍然希望利用Numpy的随机数生成器(here)。我知道我可以从我的扩展中调用Python函数,但这会减慢C循环,从而否定了编写扩展的目的吗?

1 个答案:

答案 0 :(得分:2)

当你从C扩展中调用Python函数时,你会得到几个开销:

  1. 要传递给python函数的C变量需要包装在Python对象中。如果您直接在Python中创建对象,这个成本就会大大增加。
  2. 需要调用Python函数。这将花费与普通Python函数调用一样多。
  3. 需要为C解包返回值,并且它的python值将被垃圾收集。这也只是普通Python返回值超出范围的成本。
  4. 判断它是否值得,实际上取决于在C中完成的代码量以及可以避免多少python对象操作。如果你在C中只有一个调用python函数的for循环,它可能不值得。如果你做了很多可以在C中完成的数据操作,即使你在某个地方调用Python函数,你也会保存所有这些。

    但最快的方法可能是使用numpy C API并直接从C调用numpy函数。这样可以避免大部分开销,因为不必将所有参数都包装到Python对象中,仍然使用numpy的功能。