I have a huge graph of the form {"john" {1 {"alice" 1, "bob" 3}, 4 {"alice" 2, "stan" 1}, "alice" {1 {"john" 1, "mandy" 2}, 2 {"john" 3, "stan" 2}}}
It shows for each user days on which he communicated, and for each day, with whom and how many times he addressed that person. Essentially this is an adjacency list -- here it's a map -- representation of a graph. I need to verify that for any top-level user, the days in his adjacency list, as returned by seq'ing the adjacency map. I've written these functions to do it, with the help of the #clojure folks: (defn reps-sorted1? [dreps & [progress]] (loop [[[user ureps :as userdays] :as users] (seq dreps) i 0] (if ureps (if (loop [prev 0 [[day _] :as days] (seq ureps)] (when (and progress (= 0 (mod i progress))) (print ".") (.flush System/out)) (if day (if (<= prev day) (recur day (next days)) (do (println userdays) false)) true)) (recur (next users) (inc i)) false) true))) (defn reps-sorted2? [dreps] (->> dreps (pmap (fn [[_ days]] (let [s (map first days)] (every? true? (map >= s (cons (first s) s)))))) (every? true?))) user=> (time (reps-sorted2? dreps)) "Elapsed time: 127606.905 msecs" true user=> (time (reps-sorted1? dreps)) "Elapsed time: 8368.616 msecs" true As you can see, the imperative solution vastly outperforms the functional one, even though the functional allows for pmap! Without the pmap, it actually did faster, in 40 seconds. Why is FP slower here? -- Alexy -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en