要确定是否Clojure的名单有任何物品,那岂不是更有效的(空间+内存明智)使用(zero? (count coll))在(empty? coll)它创建了一个序列?
count 本身并不总是恒定时间函数:
user> (time (count (take 1000000 (iterate inc 0))))
;;=> "Elapsed time: 185.544391 msecs"
Run Code Online (Sandbox Code Playgroud)
而且,例如,(count (range))甚至还无法完成。
虽然empty?使用seq创建序列的方法,但是仍然不会复制其内容,所以它是一个恒定时间函数(并且由于clojure的数据结构是通过内容结构共享来设计的,因此内存损失并不是很大):
user> (time (empty? (take 1000000 (iterate inc 0))))
;;=> "Elapsed time: 0.254139 msecs"
Run Code Online (Sandbox Code Playgroud)
您也可以考虑使用(= () (take 1 coll)),但我认为它不会比普通方法更好empty?