numba-cfunc

参考文档: https://numba.pydata.org/numba-doc/latest/user/cfunc.html

cfunc

创建 C/C++回调函数
与 jit 相似,有一个不同点是,cfunc 强制传递一个签名,用来确定 C 回调的可见签名。
cfunc 对象暴漏出编译后的 C 回调地址,以便可以传递给任何的外部 C/C++ 库。他还暴漏了一个 ctypes 回调对象指向该回调函数,这个对象也可以在 python 中调用,方便检查编译后的代码。

import numba as nb


@nb.cfunc("int32(int32, int32)")
def add(x, y):
    return x + y


print("add.ctypes(1, 2): ", add.ctypes(1, 2))
处理指针和数组内存

C 回调的一个不太简单的用例涉及对某些 调用方传递的数据数组。由于 C 没有高级 类似于 Numpy 数组的抽象,C 回调的签名将通过 低级指针和大小参数。尽管如此,Python 代码 回调将期望利用 Numpy 的力量和表现力 阵 列。

在以下示例中,C 回调应在二维数组上运行, 带有签名 . 您可以这样实现这样的回调:void(double *input, double *output, int m, int n)

c_sig = nb.types.void(
    nb.types.CPointer(nb.types.double),
    nb.types.CPointer(nb.types.double),
    nb.types.intc,
    nb.types.intc,
)


@nb.cfunc(c_sig)
def my_callback(in_, out, m, n):
    in_array = nb.carray(in_, (m, n))
    out_array = nb.carray(out, (m, n))
    for i in range(m):
        for j in range(n):
            out_array[i, j] = 2 * in_array[i, j]
完整代码
import numba as nb


@nb.cfunc("int32(int32, int32)")
def add(x, y):
    return x + y


print("add.ctypes(1, 2): ", add.ctypes(1, 2))


print("-" * 20)

c_sig = nb.types.void(
    nb.types.CPointer(nb.types.double),
    nb.types.CPointer(nb.types.double),
    nb.types.intc,
    nb.types.intc,
)


@nb.cfunc(c_sig)
def my_callback(in_, out, m, n):
    in_array = nb.carray(in_, (m, n))
    out_array = nb.carray(out, (m, n))
    for i in range(m):
        for j in range(n):
            out_array[i, j] = 2 * in_array[i, j]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值