Numba用scipy jit

问题描述 投票:2回答:1

所以我想加快我在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_fitintegrate.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)
        ...

有没有办法使用jitscipy.integrate.quadcurve_fit而不从scipy代码手动删除所有try except结构?

它甚至可以加速代码吗?

python scipy curve-fitting jit numba
1个回答
1
投票

Numba不是一个加速代码的通用库。有一类问题可以通过numba以更快的方式解决(特别是如果你有数组循环,数字运算),但其他一切都是(1)不支持或(2)只是稍微快一点甚至很多慢点。

[...]它甚至可以加速代码吗?

SciPy已经是一个高性能的库,所以在大多数情况下我会期望numba表现更差(或者很少:稍好一点)。您可能会做一些profiling,以确定瓶颈是否真的在您jitted的代码中,然后您可以得到一些改进。但我怀疑瓶颈会出现在SciPy的编译代码中,并且编译后的代码可能已经过大量优化(所以你找到一个只能“只”与该代码竞争的实现的可能性很小)。

有没有办法使用scit与scipy.integrate.quad和curve_fit而不从scipy代码手动删除除结构之外的所有try?

正如你正确地假设tryexcept目前根本不支持numba。

2.6.1. Language

2.6.1.1. Constructs

Numba努力支持尽可能多的Python语言,但Numba编译的函数中没有一些语言功能。目前不支持以下Python语言功能:

[...]

  • 异常处理(try .. excepttry .. finally

所以这里的答案是否定的。

© www.soinside.com 2019 - 2024. All rights reserved.