python - Numpy/Scipy 如何将 C 函数转换为向量化 Python 函数?
问题描述
据我了解,向量化的 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)
整数 k, n;
双p;
似乎底层的 C 函数不对数组进行操作,而且我找不到将这个函数转换为对数组进行操作的 Python 函数的源代码。
解决方案
在scipy.special
函数的情况下,C 代码只包含函数的“内核”,即如何将函数应用于标量。然后将这些中的每一个包装到一个ufunc
自动生成的Cython代码中。为此,它使用 C 头文件,如scipy/special/cephes.h
Cython 声明文件,如scipy/special/_cephes.pxd
文件,其中列出scipy/special/functions.json
了要为其生成的所有函数,最后是实际生成 Cython 代码的地方。scipy.special
scipy/special/_generate_pyx.py
推荐阅读
- c++ - Visual Studio 2019 C++ CodeLens
- angular - 如何在 Angular 中拦截传入路由?
- nightwatch.js - 有没有办法使用守夜人检查文本上的省略号?
- jquery - Wordpress:移动内容自动进入自定义字段
- jpa - .where 子句中的 JPA 规范和空参数
- arrays - 如何使用mvc遍历记录并保存到数据库中
- powershell - 根据当前 IP 地址更改计算机名称并从 CSV 文件查找的 PowerShell 脚本
- database - 数据库有补丁吗?
- sql-server - 在最佳键上合并旧数据
- java - Webview 字符串限制并在 targetSdkVersion 29 时显示“&”