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> 

对于定义为 set/rename-keys2

(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` 版本(出人意料地)似乎要慢一点。

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