Clojure pmap返回与map不同的结果

时间:2015-04-20 02:55:29

标签: clojure parallel-processing tic-tac-toe

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

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

(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会返回不一致的结果。不知道从哪里开始寻找。如果需要,我可以发布更多代码。

2 个答案:

答案 0 :(得分:1)

替换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代码,并阅读了很多教程。我不知道自己错过了那个非常重要的细节。

答案 1 :(得分:-1)

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

还需要考虑的另外两件事是您的代码没有副作用以及操作必须是commutativ的事实。 如果不是,则必须在合并算法中考虑这一点。

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

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

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