Re[6]: Пример из Programming Clojure
От: edbond Украина http://edbond.name
Дата: 09.09.10 19:01
Оценка:
Здравствуйте, 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)))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.