Clojure pmap 返回的结果与 map 不同



我正在学习clojure,并实施我的标准测试项目Tic Tac Toe 10。我以前用多种语言编写过相同的 AI,并且在将其扩展到其他语言中超过 6 步时也遇到了问题。

我让 AI 算法基本工作,但我正在尝试使用 pmap 提高速度。由于一切都是不可变的,我应该能够放入 pmap 代替 map 并获得相同的结果,但我没有看到。

(defn get-spot
  [board player win-cond levels]
  (def avail (get-available board))
  (def final
    (apply merge
           (map #(array-map % (calc-score board player win-cond levels %)) avail)))
  final)

但是该位置的 pmap 返回的结果不一致。不知道从哪里开始寻找。如果需要,我可以发布更多代码。

let everywhere 替换 def 解决了这个问题。如果我不使用let,我的函数有很多不一致的副作用。

(defn get-spot
  [board player win-cond levels]
  (let [avail (get-available board)
        final (apply merge
           (pmap #(array-map % (calc-score board player win-cond levels %)) avail))]
  final))

我写了一堆 clojure 代码,并通读了许多教程。我不知道我怎么错过了这个非常重要的细节。

在考虑进行性能调优之前,请阅读一两本关于clojure的书。在语言中内置不变性并不意味着你可以用pmap替换map。

还有两件事需要考虑,一是对代码没有副作用,二是操作必须是可交换的。如果不是,则必须在合并算法中考虑这一点。

正如其他人已经说过的,不要创建def绑定内部函数,而是使用let。此外,最后一个表达式无论如何都会从函数返回,因此在返回它之前不需要绑定final

很抱歉没有直接解决您的问题,我只是认为您需要了解更换地图并不像看起来那么容易。

如果你仍然想解决你的问题,我想我们需要在这里看到更多的代码。

最新更新