该文档讨论了使用numba的cfuncs作为LowLevelCallable参数scipy.integrate.quad.我需要额外的参数相同的东西.
我基本上试图做这样的事情:
import numpy as np
from numba import cfunc
import numba.types
voidp = numba.types.voidptr
def integrand(t, params):
a = params[0] # this is additional parameter
return np.exp(-t/a) / t**2
nb_integrand = cfunc(numba.float32(numba.float32, voidp))(integrand)
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用,因为params它们应该是voidptr/ void*并且它们无法转换为double.我有以下错误消息:
TypingError: Failed at nopython (nopython frontend)
Invalid usage of getitem with parameters (void*, int64)
* parameterized
Run Code Online (Sandbox Code Playgroud)
我没有找到任何关于如何从void*Numba中提取值的信息.在C中,应该是这样的a = *((double*) params)- 在Numba中可以做同样的事情吗?
我想在 python 中接口 C++ 库,它将函数指针作为参数。我看起来可以在 C 中使用 进行调用PyEval_CallObject,但要进一步进行,我需要正确的签名(输入和输出参数的类型)。是否可以从具有指定签名的python返回回调?
另外我有点担心性能,所以我也查看了numba编译python函数的python项目。如果可以在 C/C++ 中访问它以提高性能,我很感兴趣。
我想创建一个 Numba 编译的函数,它将指针或数组的内存地址作为参数并对其进行计算,例如修改基础数据。
用于说明这一点的纯 python 版本如下所示:
import ctypes
import numba as nb
import numpy as np
arr = np.arange(5).astype(np.double) # create arbitrary numpy array
def modify_data(addr):
""" a function taking the memory address of an array to modify it """
ptr = ctypes.c_void_p(addr)
data = nb.carray(ptr, arr.shape, dtype=arr.dtype)
data += 2
addr = arr.ctypes.data
modify_data(addr)
arr
# >>> array([2., 3., 4., 5., 6.])
Run Code Online (Sandbox Code Playgroud)
正如您在示例中看到的,数组arr已被修改,但未将其显式传递给函数。在我的用例中,数组的形状和数据类型是已知的,并且始终保持不变,这应该简化界面。
我现在尝试编译该modify_data函数,但失败了。我的第一次尝试是使用
shape = arr.shape
dtype = arr.dtype
@nb.njit
def modify_data_nb(ptr):
data …Run Code Online (Sandbox Code Playgroud) 我使用 Numba 来加速我的代码。它效果很好,可提供 2-3 倍的改进。然而,我的代码中花费的主要时间(大约 90%)是在 scipy 四边形积分和插值(线性和三次样条)上。我进行了数百次这些集成,因此我认为这是 Numba 可以增强的功能。看起来 Numba 不支持这些?我听说过 Numba-Scipy ,它应该让 Numba 识别 Scipy,但这似乎仍然不起作用。有没有办法让 Numba 优化我的积分/插值?