Здравствуйте, igna, Вы писали:
I>Здравствуйте, edbond, Вы писали:
E>>Нужно помнить, что map, filter и многие другие функции ленивые, поэтому отображение будет построено только до получения результата.
I>Что в зависимости от задачи может дать экономию от почти ста процентов до почти нуля. Рассмотрим вариант "почти нуля". Потребует ли такая реализация больше времени выполнения по сравнению с той, которую привел я?
Используйте time
http://clojuredocs.org/v/1527 чтобы сравнить время выполнения:
(ns indexed-test
(:require [clojure.contrib.string :as s]))
(def test-string (s/repeat 50000 "abcdef"))
;; --------------------
(defn index-of-any-helper [pred coll idx]
(when (and pred coll)
(if (pred (first coll))
idx
(recur pred (rest coll) (inc idx)))))
(defn index-of-any [pred coll]
(index-of-any-helper pred coll 0))
;; --------------------
(defn index-of-any2 [pred coll]
(first (remove nil?
(map-indexed #(when (pred %2) %1) coll))))
;; --------------------
(defn indexed [coll] (map vector (iterate inc 0) coll))
(defn index-filter [pred coll]
(when pred
(for [[idx elt] (indexed coll) :when (pred elt)] idx)))
(defn index-of-any3 [pred coll]
(first (index-filter pred coll)))
indexed-test> (time (dotimes [i 100] (index-of-any #(= % \z) test-string)))
; Evaluation aborted.
; не дождался, как и (index-of-any #(= % \z) test-string)
indexed-test> (time (dotimes [i 100] (index-of-any2 #(= % \z) test-string)))
"Elapsed time: 16539.669432 msecs"
nil
indexed-test> (time (dotimes [i 100] (index-of-any3 #(= % \z) test-string)))
"Elapsed time: 19222.019552 msecs"
nil