我想知道是否有人可以幫助我在Clojure 1.3中執行此代碼片段。我試圖實現一個簡單的函數,它需要兩個向量並且完成一個產品的總和。Clojure 1.3中的函數性能
所以我們可以說的載體是X(大小10,000個元素)和B(大小爲3種的元素),和的乘積之和被存儲在向量Y,數學上它看起來像這樣:
Y0 = B0 * X2 + B1 * X1 + B2 * X0
Y1 = B0 * X3 + B1 * X2 + B2 * X1
Y2 = B0 * X4 + B1 * X3 + B2 * X2
等...
爲此例如,Y的大小最終爲9997,相當於(10,000 - 3)。我已經設置了接受任意大小的X和B的函數。
以下是代碼:它基本上每次從X中取出(count b)
個元素,將其反轉,將*
映射到B上並彙總結果序列的內容以產生Y.
(defn filt [b-vec x-vec]
(loop [n 0 sig x-vec result []]
(if (= n (- (count x-vec) (count b-vec)))
result
(recur (inc n) (rest sig) (conj result (->> sig
(take (count b-vec))
(reverse)
(map * b-vec)
(apply +)))))))
的元件在令X (vec (range 1 10001))
和B是[1 2 3]
,該功能需要約6秒運行。我希望有人能夠提出對運行時間的改進,無論是算法,還是我可能會濫用的語言細節。
謝謝!
P.S.我做了(set! *warn-on-reflection* true)
,但沒有得到任何反射警告消息。
也許還能夠避免重複呼叫通過反轉B載體逆轉一次而不是X矢量的部分數百次?我不知道Clojure,但這看起來像很多額外的工作。 – 2012-03-12 04:42:42
實際上,反向調用是從x-vec獲取的元素(即sig被反轉) – Ankur 2012-03-12 04:46:03
如果x-vec的大小爲10000,那麼我們必須調用3333次調用來反轉這些3個元素我們正在採取,我們不是嗎?但是,如果我們只逆轉一次b-vec,我們應該能夠避免它們。或者可能是半夜,我可能需要睡覺。 – 2012-03-12 04:51:52