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(由alex+import报告)
...