【问题标题】:How does Numpy/Scipy turn C functions into vectorized Python functions?Numpy/Scipy 如何将 C 函数转换为向量化的 Python 函数?
【发布时间】:2019-01-17 14:02:32
【问题描述】:

据我了解,向量化的 numpy 函数比 Python 循环更快,因为循环是在 C 或 Fortran 中完成的。我想知道这发生在源代码的什么地方。

例如,scipy.special.bdtr 二项式 CDF 函数接受类似数组的参数 k,n,p 并返回一个 ndarray,前提是这些参数是可广播的。文档说scipy.special.bdtr 是 Cephes 数学函数库中例程的包装器。在 Github 上挖掘源代码,我发现了一个 scipy/special/cephes/bdtr.c 文件,其中包含例程的 C 代码;以下是我认为是相关 C 函数的前三行:

双 bdtr(k, n, p)

int k, n;

双倍;

似乎底层的C函数不对数组进行操作,我找不到将这个函数转换为对数组进行操作的Python函数的源代码。

【问题讨论】:

  • “包装器”并不总是意味着“直接功能映射”;包装器代码本身可能会做一些额外的事情,例如您提到的循环(尽管 scipy 前端不太可能被矢量化,因为 CMFL 的 bdtr 仅适用于 一个 参数集)。跨度>

标签: python c numpy scipy vectorization


【解决方案1】:

scipy.special 函数的情况下,C 代码只包含函数的“内核”,即如何将函数应用于标量。然后将它们中的每一个包装到 ufunc 中,并自动生成 Cython 代码。为此,它使用 C 头文件,如 scipy/special/cephes.h,Cython 声明文件,如 scipy/special/_cephes.pxd,文件 scipy/special/functions.json,其中列出了要为 scipy.special 生成的所有函数,最后是 scipy/special/_generate_pyx.py,这是实际生成 Cython 代码的地方。

【讨论】:

  • scipy/special/_generate_pyx.py 真的很难阅读,所以我在 Numpy 文档中查找了如何编写自定义 ufunc。所有的 C 对我来说都是希腊语。
  • @BatWannaBe 是的,代码生成在大多数情况下都很难阅读,这个也不例外......对于不熟悉它的人来说似乎很难理解。
猜你喜欢
  • 2020-10-10
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多