gpt4 book ai didi

python - Numpy 分段函数在 scipy quad 中很慢

转载 作者:太空宇宙 更新时间:2023-11-04 04:43:27 24 4
gpt4 key购买 nike

我试图以 numpy 方式和基本 pythonic 方式测量评估数学函数所花费的时间。首先,我测量了评估功能所需的时间。

import numpy as np
import scipy as sp
import scipy.integrate as si



def func1(x):
return np.piecewise(x, [x<=2, x>2],
[lambda x: 2*x + pow(2, x),
lambda x: -(pow(x, 2) + 2)]
)
def func2(x):
if (x<=2): return 2*x + pow(2,x)
else: return -(pow(x, 2) + 2)

data = np.linspace(-10, 10, 1000)
%timeit data1 = func1(data)
data2 = []
%timeit for i in range(0, np.size(data)): data2.append(func2(data[i]))

其实上面的结果和我预想的一样,numpy方式比basic方式快多了。

35.2 µs ± 110 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
771 µs ± 10.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

然而,奇怪的事情发生在 scipy.integrate.quad 中。以基本的 pythonic 方式集成速度要快得多。为什么会这样?

%timeit si.quad(func1, -10, 10)
%timeit si.quad(func2, -10, 10)

5.59 ms ± 25.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
187 µs ± 39.3 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

最佳答案

np.piecewise 仅在利用矢量化时速度很快。当输入是标量时,它比等效的 python 慢得多,大概是由于开销:

from timeit import timeit
kwds = dict(globals=globals(), number=1000)

print(timeit("data1 = func1(data)", **kwds))
data2 = []
print(timeit("for i in range(0, np.size(data)): data2.append(func2(data[i]))", **kwds))
data3 = []
print(timeit("for i in range(0, np.size(data)): data3.append(func1(data[i]))", **kwds))

0.06953751016408205
0.957529284991324
15.591511018108577

现在,仅是它与 func2 一起工作的事实、文档和流行的自适应集成方案的工作方式都表明 quad 调用其带有标量参数的被积函数另一个可以解释您的观察结果。

关于python - Numpy 分段函数在 scipy quad 中很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50114309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com