Skip to content

Instantly share code, notes, and snippets.

@amalloy
Last active June 14, 2017 18:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amalloy/43c5e8c15498154cafa856e917f6b6c1 to your computer and use it in GitHub Desktop.
Save amalloy/43c5e8c15498154cafa856e917f6b6c1 to your computer and use it in GitHub Desktop.
user> (defn build-paths
"Given a tree (map), return all the paths leading to a value."
[m]
(->> (for [[k v] m]
(if (map? v)
(map #(cons k %) (build-paths v))
[[k]]))
(apply concat)))
#'user/build-paths
user> (defn keys-in [m]
(if (or (not (map? m))
(empty? m))
'(())
(for [[k v] m
subkey (keys-in v)]
(cons k subkey))))
#'user/keys-in
user> (defn keys-in' [m]
(if (map? m)
(vec
(mapcat (fn [[k v]]
(let [sub (keys-in' v)
nested (map #(into [k] %) (filter (comp not empty?) sub))]
(if (seq nested)
nested
[[k]])))
m))
[]))
#'user/keys-in'
user> (let [m (into {} (for [k1 (range 10)]
[k1 (into {} (for [k2 (range 10)]
[k2 (into {} (for [k3 (range 10)]
[k3 k3]))]))]))]
(= (set (build-paths m))
(set (keys-in m))
(set (keys-in' m))))
true
user> (defn profile [f]
(let [m (into {} (for [k1 (range 10)]
[k1 (into {} (for [k2 (range 10)]
[k2 (into {} (for [k3 (range 10)]
[k3 k3]))]))]))]
(bench (count (apply concat (f m))))))
#'user/profile
user> (profile keys-in)
Evaluation count : 33900 in 60 samples of 565 calls.
Execution time mean : 1.785450 ms
Execution time std-deviation : 112.900242 µs
Execution time lower quantile : 1.643141 ms ( 2.5%)
Execution time upper quantile : 2.022882 ms (97.5%)
Overhead used : 8.829370 ns
nil
user> (profile build-paths)
Evaluation count : 31080 in 60 samples of 518 calls.
Execution time mean : 1.967505 ms
Execution time std-deviation : 139.034857 µs
Execution time lower quantile : 1.820683 ms ( 2.5%)
Execution time upper quantile : 2.255807 ms (97.5%)
Overhead used : 8.829370 ns
Found 1 outliers in 60 samples (1.6667 %)
low-severe 1 (1.6667 %)
Variance from outliers : 53.4225 % Variance is severely inflated by outliers
nil
user> (profile keys-in')
Evaluation count : 25920 in 60 samples of 432 calls.
Execution time mean : 2.476381 ms
Execution time std-deviation : 171.192428 µs
Execution time lower quantile : 2.315672 ms ( 2.5%)
Execution time upper quantile : 2.882584 ms (97.5%)
Overhead used : 8.829370 ns
Found 2 outliers in 60 samples (3.3333 %)
low-severe 2 (3.3333 %)
Variance from outliers : 51.7833 % Variance is severely inflated by outliers
nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment