使用 scipy.interpolate 内部循环时性能下降
Slow performance using scipy.interpolate inside loop
我正在使用 Python 生成用于工程模拟的输入数据。我需要定义某个物理量(我们称之为力)如何随时间变化。
力取决于一个已知的时变量(我们称之为角度)。对于每个时间步,力和角度之间的依赖关系是不同的。每个时间步长的力-角度依赖性定义为数据点,而不是函数。对于每个时间步长,我需要从该时间步长的力-角度依赖性中插入力值。我在列表理解中使用 scipy.interpolate.interp1d
。
不过,我对演出不满意。插值循环将近 20 秒,慢得令人无法接受。时间步数约为 250k。力-角度相关性中的数据点数量约为 2k。我尝试使用 for
循环,但这更慢。
如何提高性能?如果可能,执行时间需要少于一秒。此处的代码不包含我正在使用的实际数据,但足够相似。
import numpy as np
import random
from scipy.interpolate import interp1d
import time
nTimeSteps = 250000
nPoints_forceAngleDependency = 2000
# Generating an example (bogus data)
angle = np.linspace(0., 2*np.pi, nPoints_forceAngleDependency)
forceAngleDependency_forEachTimeStep = [random.random() * np.sin(angle) for i in range(nTimeSteps)]
angleHistory = [random.random() * 2 * np.pi for i in range(nTimeSteps)]
# Interpolation
start = time.time()
forceHistory = [interp1d(angle, forceAngleDependency_forEachTimeStep[i])(angleHistory[i]) \
for i in range(nTimeSteps)]
end = time.time()
print 'interpolation duration: %s s' % (end - start)
使用np.random.random(size=nTineSteps)
生成样本
对于线性插值,使用 numpy.interp
而不是 interp1d
。对于高阶样条插值,使用 CubicSpline 或 make_interp_spline,并使用矢量化评估。
我正在使用 Python 生成用于工程模拟的输入数据。我需要定义某个物理量(我们称之为力)如何随时间变化。
力取决于一个已知的时变量(我们称之为角度)。对于每个时间步,力和角度之间的依赖关系是不同的。每个时间步长的力-角度依赖性定义为数据点,而不是函数。对于每个时间步长,我需要从该时间步长的力-角度依赖性中插入力值。我在列表理解中使用 scipy.interpolate.interp1d
。
不过,我对演出不满意。插值循环将近 20 秒,慢得令人无法接受。时间步数约为 250k。力-角度相关性中的数据点数量约为 2k。我尝试使用 for
循环,但这更慢。
如何提高性能?如果可能,执行时间需要少于一秒。此处的代码不包含我正在使用的实际数据,但足够相似。
import numpy as np
import random
from scipy.interpolate import interp1d
import time
nTimeSteps = 250000
nPoints_forceAngleDependency = 2000
# Generating an example (bogus data)
angle = np.linspace(0., 2*np.pi, nPoints_forceAngleDependency)
forceAngleDependency_forEachTimeStep = [random.random() * np.sin(angle) for i in range(nTimeSteps)]
angleHistory = [random.random() * 2 * np.pi for i in range(nTimeSteps)]
# Interpolation
start = time.time()
forceHistory = [interp1d(angle, forceAngleDependency_forEachTimeStep[i])(angleHistory[i]) \
for i in range(nTimeSteps)]
end = time.time()
print 'interpolation duration: %s s' % (end - start)
使用
np.random.random(size=nTineSteps)
生成样本对于线性插值,使用
numpy.interp
而不是interp1d
。对于高阶样条插值,使用 CubicSpline 或 make_interp_spline,并使用矢量化评估。