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