欢迎!请参阅 关于 页面以获取有关如何操作的更多信息。
当在应用程序中寻找执行速度时,在构建映射和向量时使用 java.util.ArrayList 是很有诱惑力的。然而,这样做也有一些陷阱。例如,对于向量,应该使用 LazilyPersistentVector/createOwning 而不是 PersistentVector/adopt,前者可以正确工作,而后者只适用于小于 32 的向量。
java.util.ArrayList
LazilyPersistentVector/createOwning
PersistentVector/adopt
同样对于映射,如果映射中有少于 9 个条目,可以选择创建 PersistentArrayMap,但如果条目数为 9 个或更多,则应使用 PersistentHashMap。
PersistentArrayMap
PersistentHashMap
我不希望在这里提供解决方案,但 clojure.core 中有几个函数接受数组作为参数,并返回适当的数据结构 (array->vector arr) ;; 与 LazilyPersistentVector/createOwning 操作相同 (array->map arr) ;; 根据大小返回 PAM 或 PHM
clojure.core
(array->vector arr) ;; 与 LazilyPersistentVector/createOwning 操作相同 (array->map arr) ;; 根据大小返回 PAM 或 PHM
试图找到根本问题所在——这是关于建设性能问题,还是特别关于数组转换成持久向量?对于映射,我认为它是kv数组转换成持久映射?
已经有了数组转换成向量的接口 (into [] arr),所以或许这其实是关于使其更快速(这实际上与我目前正在做的工作有关)。对于映射,最好的等效方式可能是 (apply hash-map arr),但正如您所说,它会选择一个实现。
(into [] arr)
(apply hash-map arr)