向量-of在clojure中是一种执行操作的方式,因为内部值是未装箱的。我可以创建这样一个数组:
(time (count (apply vector-of :double (repeat 100000 0))));
; "Elapsed time: 1703.597 msecs"但速度很慢。有更快的路(一定有)吗?注意:预先分配向量对于assoc很重要,因为assoc如果尝试设置一个超出向量长度的元素,就会产生一个超出界限的错误。
编辑:
目前这有一个解决方案(见答案)。Leon将此作为bug发布在github 这里上。
发布于 2015-04-03 15:29:00
运行OP的代码,以便在我的机器上获得基本时间。(Mac 2009 2.66 GHz四核英特尔Xeon,48 GB内存.)Clojure 1.6.0.( 1.8.0_40 HotSpot(TM) 64位服务器VM.)
user> (time (count (apply vector-of :double (repeat 100000 0))))
"Elapsed time: 992.688709 msecs"
100000尝试(repeat 100000 0.0)以消除长到双转换。变化不大。
user> (time (count (apply vector-of :double (repeat 100000 0.0))))
"Elapsed time: 965.876047 msecs"
100000创建向量,然后添加元素,速度要快得多:
user> (time (count (into (vector-of :double) (repeat 100000 0.0))))
"Elapsed time: 52.856371 msecs"
100000稍微快一点,不要构建一个懒散的序列:
(defn n-conj [n coll elem]
(if (zero? n)
coll
(recur (dec n) (conj coll elem) elem)))
(time (count (n-conj 100000 (vector-of :double) 0.0)))
"Elapsed time: 37.86183 msecs"
100000https://stackoverflow.com/questions/29433740
复制相似问题