考虑像这样的二维矢量:
(def v2d [["a" "b" "c"]
["d" "e" "f"]
["g" "h" "i"]])
我需要交换x和v轴。所以需要将其转换为:
[["a" "d" "g"]
["b" "e" "h"]
["c" "f" "i"]]
我提出了这个解决方案:
(defn swap-xy [v2d]
(apply mapv (fn [& args] (vec args)) v2d))
我只是在问自己是否有一个不必要的步骤。变量args的类型为:clojure.lang.PersistentVector$ChunkedSeq
。这就是我必须通过使用函数vec
再次将其转换为向量的原因。
可以避免转换吗?
这是关于质疑转换的一个小基准:
user=> (time (def x (apply (fn [& args] args) (range 10000000))))
"Elapsed time: 0.446455 msecs"
#'user/x
user=> (time (def x (apply (fn [& args] (vec args)) (range 10000000))))
"Elapsed time: 721.011768 msecs"
#'user/x
答案 0 :(得分:3)
您的功能重新定义了vector
,将其写为(apply mapv vector v2d)
会更加惯用。
(apply map vector v2d)
。
此外,使用time
进行基准测试并不十分准确。最好使用Criterium等工具。