【发布时间】:2015-01-02 00:17:20
【问题描述】:
加速此功能的最佳简单方法是什么?根据 Criterium,java 中的等效代码快了近 50 倍。
我敢打赌,如果我使用 java Array 并减少装箱量会有所帮助,但我想我会先在这里发帖,看看我犯的任何基本错误是否可以轻松修复。注意我已经为 Clojure 指明了 (double...),这极大地提高了性能,但仍然不像 Java。我还首先使用 (double-array...) 而不是在函数内部使用 (vec ...) 转换了 seq,这也提高了性能,但又不像 Java。
(defn cosine-similarity [ma mb]
(let [va (vec ma), vb (vec mb)]
(loop [p (double 0)
na (double 0)
nb (double 0)
i (dec (count va))]
(if (neg? i)
(/ p (* (Math/sqrt na) (Math/sqrt nb)))
(let [a (double (va i))
b (double (vb i))]
(recur (+ p (* a b))
(+ na (* a a))
(+ nb (* b b))
(dec i)))))))
请注意,ma 和 mb 都是 seq,每个包含 200 个 Double。在 java 版本中,它们作为 double[] args 传递。
【问题讨论】:
标签: java performance clojure