8

サイズが約 50,000 要素の 2 つのベクトルに対して要素単位の操作を実行していますが、満足のいくパフォーマンスの問題 (数秒) が発生しています。異なるデータ構造を使用するなど、明らかなパフォーマンスの問題はありますか?

(defn boolean-compare
  "Sum up 1s if matching 0 otherwise"
  [proposal-img data-img]
  (sum
  (map
    #(Math/abs (- (first %) (second %)))
    (partition 2 (interleave proposal-img data-img)))))
4

2 に答える 2

11

これを試して:

(apply + (map bit-xor proposal-img data-img)))

いくつかのメモ:

  • map関数を複数のコレクションに ping すると、それぞれの要素が関数の引数として使用されます。その必要はありませinterleavepartition
  • データが1と0の場合xor、絶対差よりも高速になります

時限の例:

(def data-img (repeatedly 50000 #(rand-int 2)))
(def proposal-img (repeatedly 50000 #(rand-int 2)))
(def sum (partial apply +))

JVMをウォームアップした後...

(time (boolean-compare proposal-img data-img))
;=> "Elapsed time: 528.731093 msecs"
;=> 24802

(time (apply + (map bit-xor proposal-img data-img)))
;=> "Elapsed time: 22.481255 msecs"
;=> 24802
于 2013-05-14T01:36:50.230 に答える