【问题标题】:How to optmize integrals in numba?如何优化numba中的积分?
【发布时间】:2022-02-11 08:30:48
【问题描述】:

我正在尝试在 Python 中实现 Galerkin 不连续方法来求解偏微分方程。该方法涉及求解大量具有以下形式的常微分方程组

其中矩阵 $M^i$ 由 $L^2$ 乘积定义,即矩阵的每个条目是两个函数 $N_k$ 和 $N_l$ 乘积的积分,即

其中 $I_i=[-1,1]$。

为了做这些积分,我定义了函数 DotProduct(G, H) 如下

from scipy.integrate import quad

def DotProduct(G, H):
    F = lambda x:G(x)*H(x)
    w = quad(F, -1.0, 1.0)[0]
return w

这个函数的使用如下

f01 = lambda x: 0.5*(1-x)
f11 = lambda x: 0.5*(1+x)
Integral = DotProduct(f01, f11)
print(Integral)

我的问题是 90% 的代码执行时间专门用于计算这些积分。

我读过关于使用 numba 加快积分计算时间的文章,但在 DotProduct(G, H) 函数中实现它没有成功。

有人有什么建议吗?

【问题讨论】:

  • 首先,所有函数都必须可由 numba 编译(就像@Jérôme Richard 在他的回答中显示的那样)第二步是创建一个低级可调用对象。这避免了 Python Interperter 中的函数调用开销。示例:stackoverflow.com/a/61089817/4045774

标签: python optimization scipy numba


【解决方案1】:

几乎所有的 SciPy 函数都是not yet supported by Numba。这包括quad。话虽如此,quad 调用的函数可以被 Numba 加速。关键是你不能像你一样使用 lambda 函数,因为it is also not supported by Numba。需要在jitted函数中移动f01f11

import numba as nb
from scipy.integrate import quad

@nb.njit
def F(x):
    G = lambda x: 0.5*(1-x)
    H = lambda x: 0.5*(1+x)
    return G(x) * H(x)

def DotProduct():
    w = quad(F, -1.0, 1.0)[0]
    return w

Integral = DotProduct()
print(Integral)

这在我的机器上快了 36%,但这并不是 Numba 真正有用的情况......至少如果 F 函数很昂贵,Numba 可以更快。完成初始代码不到 6 我们。这太小了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2018-05-20
    • 1970-01-01
    • 2020-02-10
    • 2012-03-15
    相关资源
    最近更新 更多