我刚刚写了一个简单的基准测试,比较了Numba和Julia,并进行了一些讨论。链接
我想知道是否可以修复我的Numba代码,或者我尝试做的确实不受Numba支持。
我的想法是使用即时编译的数值积分法来评估这个函数。
g(p) = integrate exp(p*x) with respect to x
这是简单的正交函数:
@nb.njit
def quad_trap(f,a,b,N):
h = (b-a)/N
integral = h * ( f(a) + f(b) ) / 2
for k in range(N):
xk = (b-a) * k/N + a
integral = integral + h*f(xk)
return integral
我可以将一个JIT编译的函数传递给这个函数,就像这个函数:
@nb.njit(nb.float64(nb.float64))
def func(x):
return math.exp(x) - 10
这比纯Python快10-20倍,相当不错。
现在,我想做的是传递一个关于x和参数p的函数,类似于:
def g(p):
@nb.njit(nb.float64(nb.float64))
def integrand(x):
return math.exp(p*x) - 10
return quad_trap(integrand, -1, 1, 10000)
做这个似乎会导致Numba崩溃,甚至比纯Python更慢。
我是在做错什么,还是这个功能确实不受Numba支持?(我已经检查了文档,但我不确定问题具体在哪里。)谢谢!