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