clojure - assoc-in with two elements 和 update/assoc 的区别

标签 clojure functional-programming hashmap

我已经做了一段时间(assoc-in my-hash [:data :id] 1),看起来不错。

最近,由于我很少有超过两个级别,我注意到我可以执行 (update my-hash :data assoc :id 1),这听起来完全不同,但返回相同。

所以,我想知道,性能有什么不同吗?您认为它在某种程度上比另一种方式更具可读性吗?更地道?

update/assoc 感觉对我来说比较贵,但我真的比assoc-in更喜欢它,这让我每次看到它都会停下来思考.

最佳答案

谈到性能时,最好进行衡量。理想情况下,你会组装一个真实的 map (无论你的 map 是大还是小都会对各种操作的相对成本产生一些影响)并尝试两种方式 Criterium :

(require '[criterium.core :as c])

(let [m (construct-your-map)]
  (c/bench (assoc-in m [:data :id] 1))
  (c/bench (update m :data assoc :id 1)))

在幕后,update + assocassoc-in 的展开版本,不需要辅助向量持有 key ,所以我希望它比 assoc-in 更快。但是 (1) 通常我不会担心像这样的事情上的微小性能差异,(2) 当我关心时,再次强调,衡量比猜测更好。

(在我的机器上,使用 Clojure 1.9.0-alpha14,update + assoc 确实更快,在 ~282 ns 与 ~353 ns 相比 assoc-in 给出了我的 (assoc (into {} (map #(vector % %)) (range 20)) :data {:id 0}) 的小测试图。 )

最终在大多数情况下,可读性将是更重要的因素,但我认为您一般不能说一种方法比另一种方法更具可读性。如果您的 链已经多次使用 assoc-inupdate ,那么最好重复相同的功能一致性(只是为了避免让读者怀疑“这件事真的不同吗”)。如果您拥有自己控制的代码库,则可以采用一种偏爱一种方法而不是另一种方法的“内部风格”。等等等等

我可能会认为 assoc-in 在大多数情况下更具可读性——它使用单个“动词”并且一目了然update 是 – 但如果您更喜欢 update + assoc 并希望在您的代码库中保持它们的使用一致,那当然也很好。

关于clojure - assoc-in with two elements 和 update/assoc 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42321434/

相关文章:

clojure - 如何使用 nrepl 操作多个缓冲区?

namespaces - 无法让 pprint 在 clojure 中工作

haskell - 为什么绑定(bind)的参数有责任统一其值?

hashmap - 对包含引用的临时值强制执行生存期

clojure - 如何从 clojure leiningen 项目中删除未使用的依赖项?

clojure - defprotocol "no single method"错误似乎是 Leiningen 中的一个错误

javascript - 使用函数式编程平均二维数组中的列

javascript - 如何协调 Javascript 与柯里化(Currying)和函数组合

java - Java中如何调用另一个类的方法

java - 对 HashMap 中的值进行标记