我想通过使用 numba 的 jit
来加速我编写的程序。 然而,由于 scipy 的许多函数使用 try
... except
... 结构,jit
不能处理它们(这一点我说得对吗?)
我想到了一个相对简单的解决方案,即复制我需要的 scipy 源代码并删除其中的 try
except
部分(我已经知道它不会遇到错误,所以 try
部分始终有效)
然而,我不喜欢这个解决方案,也不确定它是否有效。
我的代码结构如下:
import scipy.integrate as integrate
from scipy optimize import curve_fit
from numba import jit
def fitfunction():
...
@jit
def function(x):
# do some stuff
try:
fit_param, fit_cov = curve_fit(fitfunction, x, y, p0=(0,0,0), maxfev=500)
for idx in some_list:
integrated = integrate.quad(lambda x: fitfunction(fit_param), lower, upper)
except:
fit_param=(0,0,0)
...
现在会导致以下错误:
LoweringError: 在对象模式后端中失败
我认为这是由于 jit
无法处理 try
except
所导致的(如果我只在 curve_fit
和 integrate.quad
部分使用 jit
并绕过自己的 try
except
结构,它也不起作用)。
import scipy.integrate as integrate
from scipy optimize import curve_fit
from numba import jit
def fitfunction():
...
@jit
def integral(lower, upper):
return integrate.quad(lambda x: fitfunction(fit_param), lower, upper)
@jit
def fitting(x, y, pzero, max_fev)
return curve_fit(fitfunction, x, y, p0=pzero, maxfev=max_fev)
def function(x):
# do some stuff
try:
fit_param, fit_cov = fitting(x, y, (0,0,0), 500)
for idx in some_list:
integrated = integral(lower, upper)
except:
fit_param=(0,0,0)
...
有没有一种方法可以在不手动删除scipy代码中的所有try except结构的情况下,将jit与scipy.integrate.quad和curve_fit一起使用?
这样做会加速代码吗?
fitfunction
呢?正是这个函数被quad
和curve_fit
反复调用。quad
已经使用了在_quadpack
模块中编译的代码。 - hpaulj