使用 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)
  1. 使用np.random.random(size=nTineSteps)生成样本

  2. 对于线性插值,使用 numpy.interp 而不是 interp1d。对于高阶样条插值,使用 CubicSpline 或 make_interp_spline,并使用矢量化评估。