所以我想加快我在numba jit
的帮助下编写的程序。然而,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
(如果我只把jit
放在curve_fit
和integrate.quad
部分并且在我自己的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)
...
有没有办法使用jit
与scipy.integrate.quad
和curve_fit
而不从scipy代码手动删除所有try
except
结构?
它甚至可以加速代码吗?
Numba不是一个加速代码的通用库。有一类问题可以通过numba以更快的方式解决(特别是如果你有数组循环,数字运算),但其他一切都是(1)不支持或(2)只是稍微快一点甚至很多慢点。
[...]它甚至可以加速代码吗?
SciPy已经是一个高性能的库,所以在大多数情况下我会期望numba表现更差(或者很少:稍好一点)。您可能会做一些profiling,以确定瓶颈是否真的在您jit
ted的代码中,然后您可以得到一些改进。但我怀疑瓶颈会出现在SciPy的编译代码中,并且编译后的代码可能已经过大量优化(所以你找到一个只能“只”与该代码竞争的实现的可能性很小)。
有没有办法使用scit与scipy.integrate.quad和curve_fit而不从scipy代码手动删除除结构之外的所有try?
正如你正确地假设try
和except
目前根本不支持numba。
2.6.1. Language
2.6.1.1. Constructs
Numba努力支持尽可能多的Python语言,但Numba编译的函数中没有一些语言功能。目前不支持以下Python语言功能:
[...]
- 异常处理(
try
..except
,try
..finally
)
所以这里的答案是否定的。