我在python3和Haskell(编译)中实现了指数加权移动平均值(ewma).这需要大约相同的时间.但是当这个函数被应用两次时,haskell版本会无法预测地减慢速度(超过1000次,而python版本仅慢2倍).
Python3版本:
import numpy as np
def ewma_f(y, tau):
a = 1/tau
avg = np.zeros_like(y)
for i in range(1, len(y)):
avg[i] = a*y[i-1]+(1-a)*avg[i-1]
return avg
Run Code Online (Sandbox Code Playgroud)
Haskell列表:
ewmaL :: [Double] -> Double -> [Double]
ewmaL ys tau = reverse $ e (reverse ys) (1.0/tau)
where e [x] a = [a*x]
e (x:xs) a = (a*x + (1-a)*(head $ e xs a) : e xs a)
Run Code Online (Sandbox Code Playgroud)
Haskell与数组:
import qualified Data.Vector as V
ewmaV :: V.Vector Double -> Double -> V.Vector …Run Code Online (Sandbox Code Playgroud)