哪个更快?映射或减少条件 fn 或进入?
which is faster? map or reduce with condition fn or get-in?
我正在使用 monger 并使用 find-maps 从我的 mongo nosql 数据库中获取一批。它 returns 一个数组,我计划在我的函数调用链下游用作数据存储区参数(参考)。在那些未来的函数调用中,我将有权访问相应的 ID。我希望使用此 id 作为查找以在我的数据存储区中获取,这样我就不必再进行一次 monger 调用。数组形式的数据存储似乎不是通过 id 访问对象的最快方式......但我不确定。
如果我需要从这个数据存储数组派生一个对象,那么我需要使用这样的函数(必须对每个元素进行 log(n))
(defn fetchObjFromArray [fetch_id inputarray]
(reduce (fn [reduced_obj element_obj]
(if (= fetch_id (get-in element_obj [:_id]))
element_obj ;; ignoring duplicates for conversation
reduced_obj
)
)
{}
inputarray
)
)
相反,如果在我最初的 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 对象中的每个键,直到它找到键和 [=31= 之间的匹配项]:
(let [report (createReportFromObjArray inputarray)
target_val (get-in report [(keyword fetch_id)])]
为什么不必在每个键上登录(n)?也许它更快,因为它可以在找到第一个 "match" 时停止,其中 map/reducing 必须完全通过 log(n)?这比必须遍历数组中的每个元素并检查 id 是否匹配 fetch_id?
快多少?
非常感谢您提供的帮助。
在您的第二个代码示例中,您将在线性时间内构建 Clojure 哈希映射。通过 get
和推导,它们的查找性能为 O(log32(N)).
在第一个示例中,您可能无意地扫描了整个输入和 return 与 ID 或空哈希映射匹配的最后一个元素。
_
我建议使用 (group-by :_id)
而不是第二个代码示例。我还建议使用 (first (filter (comp #{fetch_id} :_id) inputarray))
代替第一个示例。
避免通过 keyword
强制转换为关键字 - Clojure 关键字通常应该在编译时已知。地图支持任意数据类型作为键。
我正在使用 monger 并使用 find-maps 从我的 mongo nosql 数据库中获取一批。它 returns 一个数组,我计划在我的函数调用链下游用作数据存储区参数(参考)。在那些未来的函数调用中,我将有权访问相应的 ID。我希望使用此 id 作为查找以在我的数据存储区中获取,这样我就不必再进行一次 monger 调用。数组形式的数据存储似乎不是通过 id 访问对象的最快方式......但我不确定。
如果我需要从这个数据存储数组派生一个对象,那么我需要使用这样的函数(必须对每个元素进行 log(n))
(defn fetchObjFromArray [fetch_id inputarray]
(reduce (fn [reduced_obj element_obj]
(if (= fetch_id (get-in element_obj [:_id]))
element_obj ;; ignoring duplicates for conversation
reduced_obj
)
)
{}
inputarray
)
)
相反,如果在我最初的 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 对象中的每个键,直到它找到键和 [=31= 之间的匹配项]:
(let [report (createReportFromObjArray inputarray)
target_val (get-in report [(keyword fetch_id)])]
为什么不必在每个键上登录(n)?也许它更快,因为它可以在找到第一个 "match" 时停止,其中 map/reducing 必须完全通过 log(n)?这比必须遍历数组中的每个元素并检查 id 是否匹配 fetch_id?
快多少?非常感谢您提供的帮助。
在您的第二个代码示例中,您将在线性时间内构建 Clojure 哈希映射。通过 get
和推导,它们的查找性能为 O(log32(N)).
在第一个示例中,您可能无意地扫描了整个输入和 return 与 ID 或空哈希映射匹配的最后一个元素。
_
我建议使用 (group-by :_id)
而不是第二个代码示例。我还建议使用 (first (filter (comp #{fetch_id} :_id) inputarray))
代替第一个示例。
避免通过 keyword
强制转换为关键字 - Clojure 关键字通常应该在编译时已知。地图支持任意数据类型作为键。