要确定Clojure list是否有任何项目,使用(zero? (count coll))
而不是(empty? coll)
来创建序列会更有效(空间+内存方式)吗?
询问,因为the docs show列出了一个示例。
答案 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
调用引起了问题。