Last active
June 14, 2017 18:46
-
-
Save amalloy/43c5e8c15498154cafa856e917f6b6c1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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