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

欢迎!请参见 关于 页面以了解更多有关如何操作的信息。

0
Clojure

clojure.core/sort-by 为每对比较评估 keyfn。当 keyfn 的计算成本很高时,这是浪费的。

`
user=> (def keyfn-calls (atom 0))

'user/keyfn-calls

user=> (defn keyfn [x] (do (swap! keyfn-calls inc) x))

'user/keyfn

user=> @keyfn-calls
0
user=> (sort-by keyfn (repeatedly 10 rand))
(0.1647483850582695 0.2836687590331822 0.3222305842748623 0.3850390922996001 0.41965440953966326 0.4777580378736771 0.6051704988802923 0.659376178201709 0.8459820304223701 0.938863131161208)
user=> @keyfn-calls
44
`

6 答案

0

评论者:stevemkim

(链接:CLJ-99) 是一个类似的问题

0

评论者:michaelblume

在定义之前避免使用 for

0

评论者:jafingerhut

Michael,您的补丁 CLJ-1402-v2.patch 是否故意修改了 sort-by 的文档字符串,因为您正在删除的句子现在已经过时?如果是这样,这里可以明确提及这一点。

0

评论者:michaelblume

是的,补丁修改了排序方式,使得它先遍历集合然后再对结果序列进行排序。这意味着数组将保持不变,而创建一个新的序列。

0

评论由:alexmiller 提出

由于额外的分配,这个补丁看起来可能比之前慢,而不是更快。在认真考虑之前,它真的需要性能测试。

0
参考:[https://clojure.atlassian.net/browse/CLJ-1402](https://clojure.atlassian.net/browse/CLJ-1402)(由 alex+import 报告)
...