2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面获取更多关于这个工具的信息。

+1
Clojure
编辑

所以对于一个相对较小的xrel并且重命名相对较少,似乎有一些性能提升空间。

user> (def xrel {:a 1, :b 2, :c 3})
;; => #'user/xrel
user> (def kmap {:a :z})
;; => #'user/kmap
user> (quick-bench (set/rename-keys xrel kmap))
Evaluation count : 2959512 in 6 samples of 493252 calls.
         Execution time mean : 200.870412 ns
Execution time std-deviation : 0.882651 ns
Execution time lower quantile : 200.116289 ns ( 2.5%)
Execution time upper quantile : 202.248092 ns (97.5%)
               Overhead used : 2.151518 ns

Found 1 outliers in 6 samples (16.6667 %)
low-severe	 1 (16.6667 %)
Variance from outliers : 13.8889 % Variance is moderately inflated by outliers
;; => nil
user> (quick-bench (set/rename-keys2 xrel kmap))
Evaluation count : 9627438 in 6 samples of 1604573 calls.
         Execution time mean : 59.646747 ns
Execution time std-deviation : 0.083186 ns
Execution time lower quantile : 59.540415 ns ( 2.5%)
Execution time upper quantile : 59.723488 ns (97.5%)
                Overhead used : 2.151518 ns
;; => nil
user> 

对于定义为

(defn rename-keys2
  "Returns the map with the keys in kmap renamed to the vals in kmap"
  {:added "1.0"}
  [map kmap]
  (reduce-kv
   (fn [m old new]
     (if (contains? map old)
       (-> m
           (assoc new (get map old))
           (dissoc old))
       m)) map kmap))

这样的代码,作为研究改进rename-keys的开始,是否有趣?

1 个答案

0

我认为我需要从一个叫做update-keys的函数开始。

这可能是这样的

(defn rename-keys [m km] (update-keys m #(get km % %)))
作者:
这里有一个细微的差别,即`update-keys`始终返回一个映射,即使是对于`nil`,而`set/rename-keys`对于`nil`返回`nil`。

此外,`update-keys`版本似乎(令人惊讶地)稍微慢一些

用户> (quick-bench (clojure.set/rename-keys2 xrel kmap))
评估次数:9637890次,在1606315次调用中的6个样本。
             执行时间平均值:59.522351 ns
    执行时间标准差:0.059405 ns
   执行时间下四分位数:59.452942 ns (2.5%)
   执行时间上四分位数:59.580547 ns (97.5%)
                   开销:2.151518 ns
;; => nil
用户> (quick-bench (clojure.set/rename-keys3 xrel kmap))
评估次数:5567220次,在927870次调用中的6个样本。
             执行时间平均值:106.542514 ns
    执行时间标准差:1.114478 ns
   执行时间下四分位数:105.393362 ns (2.5%)
   执行时间上四分位数:107.800880 ns (97.5%)
                   开销:2.151518 ns
;; => nil
作者:
在处理单个键多次的情况 down,难以进行这种速度比较。虽然,`update-keys`在总体上可能较慢,但需要思考`rename-keys`的典型用例的类型。在`update-keys`的情况下,我们确定需求通常出现在发送和接收信息包或在处理实体映射的Web应用中,需要在整个键上执行转换——通常是将字符串键转换为关键字再转换回来。
...