首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在clojure中初始化大向量的有效方法

在clojure中初始化大向量的有效方法
EN

Stack Overflow用户
提问于 2015-04-03 14:07:02
回答 1查看 561关注 0票数 2

向量-of在clojure中是一种执行操作的方式,因为内部值是未装箱的。我可以创建这样一个数组:

代码语言:javascript
运行
复制
(time (count (apply vector-of :double (repeat 100000 0))));
; "Elapsed time: 1703.597 msecs"

但速度很慢。有更快的路(一定有)吗?注意:预先分配向量对于assoc很重要,因为assoc如果尝试设置一个超出向量长度的元素,就会产生一个超出界限的错误。

编辑:

目前这有一个解决方案(见答案)。Leon将此作为bug发布在github 这里上。

EN

Stack Overflow用户

回答已采纳

发布于 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.)

代码语言:javascript
运行
复制
user> (time (count (apply vector-of :double (repeat 100000 0))))
"Elapsed time: 992.688709 msecs"
100000

尝试(repeat 100000 0.0)以消除长到双转换。变化不大。

代码语言:javascript
运行
复制
user> (time (count (apply vector-of :double (repeat 100000 0.0))))
"Elapsed time: 965.876047 msecs"
100000

创建向量,然后添加元素,速度要快得多:

代码语言:javascript
运行
复制
user> (time (count (into (vector-of :double) (repeat 100000 0.0))))
"Elapsed time: 52.856371 msecs"
100000

稍微快一点,不要构建一个懒散的序列:

代码语言:javascript
运行
复制
(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"
100000
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29433740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档