首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的Clojure代码运行得这么慢?

为什么我的Clojure代码运行得这么慢?
EN

Stack Overflow用户
提问于 2014-09-11 17:30:20
回答 3查看 123关注 0票数 2

下面是我对4 4clojure 问题108的回答

我能通过前三次测试,但最后一次测试超时了。在最后一次测试中,代码运行得非常非常慢。到底是什么导致了这一切?

代码语言:javascript
运行
复制
((fn [& coll] (loop [coll coll m {}]
    (do
        (let [ct (count coll)
                ns (mapv first coll)
                m' (reduce #(update-in %1 [%2] (fnil inc 0)) m ns)]
            (println m')
            (if (some #(<= ct %) (mapv m' ns))
                (apply min (map first (filter #(>= (val %) ct) m')))
                (recur (mapv rest coll) m'))))))
 (map #(* % % %) (range)) ;; perfect cubes
 (filter #(zero? (bit-and % (dec %))) (range)) ;; powers of 2
 (iterate inc 20))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-11 18:14:48

您正在从每个迭代(recur (mapv rest coll) m')上的每个输入中收集下一个值。

您的一个输入生成值的速度非常慢,并且非常快地计算到非常高的值:(filter #(zero? (bit-and % (dec %))) (range))

您的代码正在花费大部分时间,通过增加一个和测试位元来发现两个的能力。

您不需要一个包含事件计数的所有输入的映射。您不需要为尚未找到的最低项找到下一个值。我不会发布解决方案,因为这是一个练习,但是在每次迭代中消除最低的不匹配值应该是一个开始。

票数 2
EN

Stack Overflow用户

发布于 2014-09-11 18:31:38

除了这里的其他好答案之外,您还在做大量的数学,但是所有的数字都是作为对象而不是作为原语使用的。做这个更好的这里有很多提示。

票数 2
EN

Stack Overflow用户

发布于 2014-09-11 18:13:16

这是计算2的幂的一种效率很低的方法:

代码语言:javascript
运行
复制
(filter #(zero? (bit-and % (dec %))) (range))

这实际上是从0到无穷远的计数,测试每一个数字的过程,看看它是否为2的幂。进入序列越远,每次调用rest的开销就越大。

考虑到这是测试输入,而且您不能更改它,我认为您需要重新考虑您的方法。与调用(mapv rest coll)不同,您可能只想用最小的第一个值调用序列上的rest

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25793668

复制
相关文章

相似问题

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