【发布时间】:2019-07-12 08:56:37
【问题描述】:
要确定Clojure list 是否有任何项目,使用(zero? (count coll)) 而不是创建序列的(empty? coll) 不是更有效(空间+ 内存)吗?
询问是因为the docs show 列表作为示例之一。
【问题讨论】:
标签: clojure
要确定Clojure list 是否有任何项目,使用(zero? (count coll)) 而不是创建序列的(empty? coll) 不是更有效(空间+ 内存)吗?
询问是因为the docs show 列表作为示例之一。
【问题讨论】:
标签: clojure
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? 做得更好
【讨论】:
counted? 返回其集合参数是否在恒定时间内响应count。
count 的恒定时间(显示在该链接中+innoq.com/blog/st/2010/04/clojure-performance-guarantees)但example for empty? 也使用列表。这是有道理的 count 在惰性序列上不是恒定的。
(这是Leetwinski's answer的附录。)
Clojure 改进了以前的 Lisps (IMO),通过一组函数来操作各种 sequences:无论是否懒惰,是否已编入索引。
尽量不要依赖于特定类型的顺序集合(在您的情况下是列表)。您可能会被提供错误序列的客户伏击。
例如,您可能认为列表上的cons 会返回一个列表。它没有。它返回一个clojure.lang.Cons,不是counted?。当代码开始缓慢运行时,我不想发现count 调用导致了问题。
【讨论】: