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

从C扩展调用Python函数的速度成本,python,c,numpy,Python,C,Numpy,我正在写一个程序,其中包括模拟几个不同变量的进化路径。该程序的大部分是用Python编写的,但我正在为模拟循环(~15k)编写代码,作为C扩展以提高速度。然而,我仍然希望利用Numpy的随机数生成器()。我知道我可以从扩展中调用Python函数,但这会降低C循环的速度,从而否定编写扩展的初衷吗?当从C扩展调用Python函数时,会产生部分开销: 要传递给python函数的C变量需要包装在python对象中。这与直接在Python中创建对象的成本差不多 需要调用Python函数。这将花费与普通Py

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

当从C扩展调用Python函数时,会产生部分开销:

  • 要传递给python函数的C变量需要包装在python对象中。这与直接在Python中创建对象的成本差不多
  • 需要调用Python函数。这将花费与普通Python函数调用一样多的成本
  • 需要为C打开返回值,它的python值将被垃圾收集。这与超出范围的普通Python返回值的成本差不多
  • 要判断它是否值得,这实际上取决于在C语言中完成的代码量以及在C语言中可以避免多少python对象操作。如果在C语言中只有一个调用python函数的
    for
    循环,那么这可能不值得。如果你做了很多可以用C来完成的数据操作,即使你在某处调用了Python函数,你也会保存所有的数据操作


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

    您需要了解许多细节,但是numpy中的随机数生成器有一个C接口。我认为这是您想要包含的头文件,但是还有一个。感谢您指出
    randomkit.h
    distributions.h
    。作为此功能的附加功能,还需要相应的.c文件(
    randomkit.c
    distributions.c
    )。它们需要包含在setup.py的
    列表中。