Clojure 哪个更快?映射或减少条件fn或进入?

Clojure 哪个更快?映射或减少条件fn或进入?,clojure,monger,Clojure,Monger,我正在使用monger并使用find maps从我的mongo nosql数据库中获取一批数据。它返回一个数组,我计划将其用作函数调用链下游的数据存储参数(引用)。在这些未来的函数调用中,我将有权访问相应的id。我希望使用此id作为查找,以便在我的数据存储中获取数据,这样我就不必进行另一个monger调用。数组形式的数据存储似乎不是通过id访问对象的最快方式。。。。但我不确定 如果我需要从这个数据存储阵列派生一个对象,那么我需要使用这样的函数(必须在每个元素上记录(n)) 相反,如果在最初的mo

我正在使用monger并使用find maps从我的mongo nosql数据库中获取一批数据。它返回一个数组,我计划将其用作函数调用链下游的数据存储参数(引用)。在这些未来的函数调用中,我将有权访问相应的id。我希望使用此id作为查找,以便在我的数据存储中获取数据,这样我就不必进行另一个monger调用。数组形式的数据存储似乎不是通过id访问对象的最快方式。。。。但我不确定

如果我需要从这个数据存储阵列派生一个对象,那么我需要使用这样的函数(必须在每个元素上记录(n))

相反,如果在最初的monger调用之后,我创建了一个key/val散列对象,其函数如下:

(defn createReportFromObjArray [inputarray]

    (reduce (fn [returnobj elementobj]

                (let [_id (get-in elementobj [:_id])
                      keyword (keyword _id)]

                    (assoc returnobj keyword elementobj)
                ) ;; ignoring duplicates for conversation
            )
            {}
            inputarray)
)
然后,也许我的后续调用可以改为使用get-in,这样会更快,因为我将通过键获取数据

我很困惑,因为:当我使用get-in时,它是否必须迭代key/val-has对象中的每个键,直到找到键和fetch_-id之间的匹配:

(let [report (createReportFromObjArray inputarray)
      target_val (get-in report [(keyword fetch_id)])]
为什么不登录每个密钥?也许它的速度更快,因为它可以在找到第一个“匹配”时停止,其中map/reduce必须遍历log(n)?这比遍历数组中的每个元素并签入id是否与fetch\u id匹配要快多少


非常感谢您提供的帮助。

在第二个代码示例中,您正在线性时间内构建Clojure哈希映射。通过
get
和派生,它们的查找性能为O(log32(N))

在第一个示例中,您扫描整个输入并返回与ID或空哈希映射匹配的最后一个元素,这可能是无意的

_

我建议使用
(groupby:_id)
而不是第二个代码示例。我还建议使用
(首先(filter(comp#{fetch_id}:_id)inputarray))
代替第一个示例


避免通过
关键字转换为关键字
——Clojure关键字通常应在编译时已知。映射支持任意数据类型作为键。

在第二个代码示例中,您正在线性时间内构建Clojure哈希映射。通过
get
和派生,它们的查找性能为O(log32(N))

在第一个示例中,您扫描整个输入并返回与ID或空哈希映射匹配的最后一个元素,这可能是无意的

_

我建议使用
(groupby:_id)
而不是第二个代码示例。我还建议使用
(首先(filter(comp#{fetch_id}:_id)inputarray))
代替第一个示例


避免通过
关键字转换为关键字
——Clojure关键字通常应在编译时已知。映射支持任意数据类型作为键。

因此,当我使用(get in…)时,有一种内置算法(O(log32(N)),其性能比必须传递每个键才能找到相关值要好。在第二个和第三个示例中,您说明了如何构建哈希映射,然后通过get in按键查找(您也可以使用get)。这就是我们的表现。由于您在第二个示例中构建了一个哈希映射,因此在该哈希映射中查找密钥的性能要比在第一个示例中要好得多,在第一个示例中,您迭代所有元素直到找到某个元素。您可能想理解-或者我误解了您的问题。因此,当我使用(get in…)时,有一种内置算法(O(log32(N)),其性能比必须传递每个键才能找到关联的值要好。在第二个和第三个示例中,您说明了如何构建哈希映射,而不是通过get in按键查找(您也可以使用get)。这说明了性能。由于您在第二个示例中构建了哈希映射,因此在该哈希映射中查找密钥的性能明显优于第一个示例,在第一个示例中,您迭代所有元素,直到找到某个内容。您可能想理解—或者我误解了您的问题。
(let [report (createReportFromObjArray inputarray)
      target_val (get-in report [(keyword fetch_id)])]