gpt4 book ai didi

performance - 我的 Clojure 函数在使用列表或向量时可能会很慢吗?

转载 作者:行者123 更新时间:2023-12-04 22:07:15 25 4
gpt4 key购买 nike

我刚刚在学习 Clojure,我刚刚写了这个函数:

(defn replace-last [coll value]
(assoc coll (dec (count coll)) value))

我只是有点担心列表和/或向量可能真的很慢——我只是对它们的了解还不够了解。

谢谢!

最佳答案

对于向量,这将非常快——向量的 promise 之一是快速创建稍微修改的副本。

对于列表,这根本不起作用——它们不是关联的( clojure.lang.Associative ),因此不是 assoc 的有效参数。至于其他可能的方法,如果您需要返回实际列表(而不是 seq(able)),那您就不走运了——访问/替换列表的最后一个元素基本上是一个线性时间操作。另一方面,如果你可以接受一个除了最后一个元素之外看起来像你的列表的懒惰序列,你可以实现 butlast 的半懒惰变体(clojure.core 中的那个根本不是懒惰的)和将其与 lazy-cat 一起使用:

(defn semi-lazy-butlast [s]
(cond (empty? s) s
(empty? (next s)) nil ; or perhaps ()
:else (lazy-seq (cons (first s)
(semi-lazy-butlast (next s))))))

(defn replace-last [s x]
(if (empty? s) ; do nothing if there is no last element to replace
s
(lazy-cat (semi-lazy-butlast s) [x])))

这会推迟替换最后一个元素,直到您在使用 seq 时真正接近它。

示例交互:
user=> (take 10 (replace-last (range) :foo))
(0 1 2 3 4 5 6 7 8 9)
user=> (take 10 (replace-last (range 10) :foo))
(0 1 2 3 4 5 6 7 8 :foo)
user=> (replace-last () :foo)
()

关于performance - 我的 Clojure 函数在使用列表或向量时可能会很慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8886658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com