【问题标题】:Why use empty over count?为什么要使用empty over count?
【发布时间】:2019-07-12 08:56:37
【问题描述】:

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

询问是因为the docs show 列表作为示例之一。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    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? 做得更好

    【讨论】:

    【解决方案2】:

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

    Clojure 改进了以前的 Lisps (IMO),通过一组函数来操作各种 sequences:无论是否懒惰,是否已编入索引。

    尽量不要依赖于特定类型的顺序集合(在您的情况下是列表)。您可能会被提供错误序列的客户伏击。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2011-06-01
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多