보다 하스켈 느리다 (컴파일). 그것은 거의 같은 시간이 걸립니다. 이 함수를 두 번인가 그러나 때 (파이썬 버전은 약 2 배 느린 반면,보다 1000 배)을 하스켈 버전 다운 예기치 느려.유사한 코드 파이썬
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
하스켈 : 어레이와
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)
하스켈 모든 경우
import qualified Data.Vector as V
ewmaV :: V.Vector Double -> Double -> V.Vector Double
ewmaV x tau = V.map f $ V.enumFromN 0 (V.length x)
where
f (-1) = 0
f n = (x V.! n)*a + (1-a)*(f (n-1))
a = 1/tau
이 계산은 검사를 동시에 (약 얻어 배열 10000 요소). "GHC -O2는"어떤 차이를하지 않았지만 하스켈 코드는 어떤 플래그없이 컴파일.
이 계산 된 절대 값과 절대 편차를 계산하기 위해 계산 된 값을 사용했습니다. 그런 다음이 편차에 ewma 함수를 적용했습니다.
Python3은 :
def ewmd_f(y, tau):
ewma = ewma_f(y, tau)
return ewma_f(np.abs(y-ewma), tau)
이 두 번 이상 EWMA에 비해 실행됩니다. 목록과
하스켈 :
ewmdL :: [Double] -> Double -> [Double]
ewmdL xs tau = ewmaL devs tau
where devs = zipWith (\ x y -> abs $ x-y) xs avg
avg = (ewmaL xs tau)
하스켈 벡터와는 :
ewmdV :: V.Vector Double -> Double -> V.Vector Double
ewmdV xs tau = ewmaV devs tau
where devs = V.zipWith (\ x y -> abs $ x-y) xs avg
avg = ewmaV xs tau
모두 자신의 EWMA에 비해> 1000 느리게 실행 ewmd. 내가와 하스켈 코드 평가
from time import time
x = np.sin(np.arange(10000))
tau = 100.0
t1 = time()
ewma = ewma_f(x, tau)
t2 = time()
ewmd = ewmd_f(x, tau)
t3 = time()
print("EWMA took {} s".format(t2-t1))
print("EWMD took {} s".format(t3-t2))
:
나는 함께 python3 코드를 평가 동등한 보일 수 있습니다
import System.CPUTime
timeIt f = do
start <- getCPUTime
end <- seq f getCPUTime
let d = (fromIntegral (end - start))/(10^12) in
return (show d)
main = do
let n = 10000 :: Int
let tau = 100.0
let l = map sin [0.0..(fromIntegral $ n-1)]
let x = V.map sin $ V.enumFromN 0 n
putStrLn "Vectors"
aV <- timeIt $ V.last $ ewmaV x tau
putStrLn $ "EWMA (vector) took "++aV
dV <- timeIt $ V.last $ ewmdV x tau
putStrLn $ "EWMD (vector) took "++dV
putStrLn ""
putStrLn "Lists"
lV <- timeIt $ last $ ewmaL l tau
putStrLn $ "EWMA (list) took "++lV
lD <- timeIt $ last $ ewmdL l tau
putStrLn $ "EWMD (list) took "++lD
다음은 해당 기준 파일의 모양입니다. http://sprunge.us/VONE – Michael