我是Clojure和函数式编程的新手。我想以下列格式创建100,000个密钥列表:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
我这样做:
(defn get-key [chunk-size, key-length]
(apply str
(flatten
(interpose "-"
(partition chunk-size
(take key-length
(repeatedly #(rand-nth "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"))))))))
(defn dump-keys [n, chunk-size, key-length]
(with-open [wrt (io/writer "keys.txt")]
(doseq [i (range n)]
(.write wrt (str (get-key chunk-size key-length) "\n")))))
哪个产生
KYFL0-7YO6J-30XMV-ZIGE7-MK009
MNQZH-K7L8I-35C0K-7DS7Q-OTZWI
MVB9D-GHME9-IMGCL-YPAKX-4YZVD
... etc
但是,它需要大约5秒钟,与类似的命令式算法相比,它相对较长。
什么被认为是做我正在做的事情的惯用(和快速)方式?
答案 0 :(得分:5)
为了获得最大速度,我建议采用以下技术:
(char-array 29)
aset
设置数组中每个位置的字符java.util.Random
快约150%).charAt
查找字符,例如像(.charAt "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" (int (Rand/r 36)))
dotimes
作为循环 - 这通常比映射/任何序列如果你完成上述所有工作,你应该得到非常高效的代码,可能与你用纯Java编写它的速度一样快。
答案 1 :(得分:0)
如果你想获得最大的性能,我认为你不会比在Java中编写这个函数,并从Clojure调用它更好。或者,如果您想留在Clojure中,可以使用aset
填充Java char
数组,并使用(String. array)
将它们转换为字符串。我认为这不是真正的“惯用”Clojure,但它会很快。