Clojure pmap返回与map不同的结果

Clojure pmap返回与map不同的结果,clojure,parallel-processing,tic-tac-toe,Clojure,Parallel Processing,Tic Tac Toe,我正在学习clojure,并实施我的标准测试项目。我以前曾用多种语言编写过相同的AI,但在其他语言中扩展到6步之后也遇到了问题 我让人工智能算法基本正常工作,但我正试图用pmap提高速度。因为一切都是不可变的,我应该能够在pmap中替换map,得到相同的结果,但我看不到这一点 (defn get-spot [board player win-cond levels] (def avail (get-available board)) (def final (apply mer

我正在学习clojure,并实施我的标准测试项目。我以前曾用多种语言编写过相同的AI,但在其他语言中扩展到6步之后也遇到了问题

我让人工智能算法基本正常工作,但我正试图用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返回的结果不一致。不知道从哪里开始找。如果需要的话,我可以发布更多的代码。

< P>请阅读一本关于CuljEube的书或两本,然后再考虑进行性能调整。将不变性内置到语言中并不意味着您可以用pmap替换map

两个要考虑的问题是代码的副作用和操作必须是交换性的事实。 如果不是,则必须在合并算法中考虑这一点。 正如其他人已经说过的,不要创建

def
绑定内部函数,而是使用
let
。另外,最后一个表达式无论如何都会从函数返回,因此在返回它之前不需要绑定
final

我很抱歉没有给你的问题提供一个直接的解决方案,我只是认为你需要明白,地图的更换并不像看上去那么容易


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

用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代码,并阅读了许多教程。我不知道我怎么会错过那个真正重要的细节。

不要在函数内部使用
def
,因为
def
总是在名称空间范围内创建绑定,而不是在函数的范围内。如果
calc score
对其计算内部的值使用
def
pmap
将给出错误的结果。使用
let
创建需要对一个函数进行本地的绑定。Brian-您将哪些部分隔离为“非性能”部分?“获取可用信息”或“计算分数”是否执行任何薪酬时间导入?您提到了pmap,但您正在显示阵列映射。你有没有比较好的时间安排?是的,肯定到处都用def。让我尝试用Let替换函数局部变量,看看这是否解决了并行性问题。