为什么要使用空计数?

时间:2019-07-12 08:56:37

标签: clojure

要确定Clojure list是否有任何项目,使用(zero? (count coll))而不是(empty? coll)来创建序列会更有效(空间+内存方式)吗?

询问,因为the docs show列出了一个示例。

2 个答案:

答案 0 :(得分:7)

count本身并不总是恒定时间函数:

user> (time (count (take 1000000 (iterate inc 0))))
;;=> "Elapsed time: 185.544391 msecs"

此外,例如(count (range))甚至不会完成。

虽然empty?使用seq创建了序列,但仍然不复制其内容,因此它是一个恒定时间函数(并且由于clojure的数据结构是通过内容结构共享来设计的,内存损失不是很大):

user> (time (empty? (take 1000000 (iterate inc 0))))
;;=> "Elapsed time: 0.254139 msecs"

您还可以考虑使用(= () (take 1 coll)),但我认为它不会比普通empty?

做得更好

答案 1 :(得分:0)

(这是Leetwinski's answer的附录。)

Clojure具有以前的Lisps(IMO)改进,它具有一组功能来处理所有sequences:懒惰与否,索引编制与否。

尽量不要依赖于特定种类的顺序收集(在您的情况下为列表)。您可能会被客户提供错误类型的序列所困扰。

例如,您可能会认为列表上的cons将返回一个列表。没有。它返回clojure.lang.Cons,而不是counted? 。当代码开始缓慢运行时,我不想发现是count调用引起了问题。