【发布时间】:2018-05-01 09:39:24
【问题描述】:
我试图以 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方式比基本方式快很多。
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)
【问题讨论】:
-
如果性能很重要,请使用低级可调用进行集成。这将比标准的 python 方式至少高出一个数量级。例如。 stackoverflow.com/a/50097776/4045774