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

标签 python c numpy

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

最佳答案

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

  1. 要传递给 python 函数的 C 变量需要包装在 Python 对象中。这与直接在 Python 中创建对象的成本差不多。
  2. 需要调用 Python 函数。这将花费与普通 Python 函数调用一样多的费用。
  3. 需要为 C 解包返回值,它的 python 值将被垃圾收集。这也与超出范围的正常 Python 返回值一样多。

要判断它是否值得,实际上取决于在 C 中完成的代码量以及在那里可以避免多少 python 对象操作。如果您在 C 中只有一个调用 python 函数的 for 循环,那么它可能不值得。如果您执行大量可以在 C 中完成的数据操作,那么即使您在某处调用 Python 函数,您也将保存所有这些操作。

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

关于python - 从 C 扩展调用 Python 函数的速度成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173025/

相关文章:

c - 如何从 CUDA 内核函数返回单个变量?

c - 出于某种原因,printf 函数在我要显示的内容上添加了一个空格

python - 定期更新 Tkinter 中的标签

python - 检查 Flask-HTTPAuth 是否在 View 中通过身份验证

Python Google App Engine Image 对象

c - `int` 数组中的无效输出

python - 同时并行读取 numpy 数组

python - 直观理解 Numpy nd 数组

python - 合并具有特定条件的数据帧

python - Pandas 检查列是否是类别问题