Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Clojure的收藏中挑选一些物品,为什么subvec比Take&;慢;滴_Clojure - Fatal编程技术网

从Clojure的收藏中挑选一些物品,为什么subvec比Take&;慢;滴

从Clojure的收藏中挑选一些物品,为什么subvec比Take&;慢;滴,clojure,Clojure,是否有一种从收藏中提取某些物品的方法 我是这样做的: (time (drop 30 (take 70 (range 10001)))) ;> "Elapsed time: 0.049797 msecs" ;> (30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69) (time (subvec (v

是否有一种从收藏中提取某些物品的方法

我是这样做的:

(time (drop 30 (take 70 (range 10001))))
;> "Elapsed time: 0.049797 msecs"
;> (30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69)

(time (subvec (vec (range 10001)) 30 70))
;> "Elapsed time: 2.072258 msecs"
;> [30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69]
问题:

  • 为什么subvec方法比take&drop方法慢
  • 这样做的惯用方式是什么
  • 不是懒惰的,所以您创建了一个包含10001个项目的完整数组,然后获取它的子向量,而drop/take/range是懒惰的,所以只提供您需要的项目。您不会对最后(10001-70)项执行任何操作,因此不会创建/使用它们,因此不会占用任何时间

  • 您的第一个版本对于您正在做的事情来说已经足够惯用了

  • 不是懒惰的,所以您创建了一个包含10001个项目的完整数组,然后获取它的子向量,而drop/take/range是懒惰的,所以只提供您需要的项目。您不会对最后(10001-70)项执行任何操作,因此不会创建/使用它们,因此不会占用任何时间

  • 您的第一个版本对于您正在做的事情来说已经足够惯用了


  • 你的比较没有以正确的方式进行

    单个
    时间
    不足以比较两个代码块。您应该使用
    dotimes
    重复多次,以便执行时间的差异更加可靠:

    ;; returns the time it took to repeat running the code 1000 times
    (time (dotimes [i 1000] your-code-block))
    
    在第二个代码块中,将
    range
    返回的惰性序列转换为带有
    vec
    的vector,这也需要一些额外的时间:

    (vec (range 10001))
    
    您可以使用
    time
    +
    dotimes
    技术将上述内容与
    (范围10001)
    本身进行比较


    我希望这将是你进一步探索的基础。

    < P>你的比较没有按照正确的方式进行。

    单个
    时间
    不足以比较两个代码块。您应该使用
    dotimes
    重复多次,以便执行时间的差异更加可靠:

    ;; returns the time it took to repeat running the code 1000 times
    (time (dotimes [i 1000] your-code-block))
    
    在第二个代码块中,将
    range
    返回的惰性序列转换为带有
    vec
    的vector,这也需要一些额外的时间:

    (vec (range 10001))
    
    您可以使用
    time
    +
    dotimes
    技术将上述内容与
    (范围10001)
    本身进行比较


    希望这是你进一步探索的基础。非常感谢你!啊,懒惰很重要!非常感谢你!非常感谢您教我
    (time(dotimes…)
    方法。从现在起我会用它。这很有帮助。Clojure社区的人真的很棒。语言迫使他们这么做:)对于适当的微基准标记,你也可以使用非常感谢你教我
    (time(dotimes…)
    方法。从现在起我会用它。这很有帮助。Clojure社区的人真的很棒。语言迫使他们这么做:)对于适当的微基准,你也可以使用