2016-05-04 7 views
1

私はargmaxを実装することを考えています(マップとリダクション)とiterating。ここでReduce、Map、およびIterations:効率

は、マップを使用して、私の実装だと削減:

to-report argmax1 [arguments f] 
    if length arguments = 0 [ show "incorrect length of arguments" report nobody] 
    report first reduce [ ifelse-value ((last ?1) > (last ?2)) [?1] [?2]] map [(list ? (runresult f ?))] arguments 
end 

は、ここで反復を使用して、私の実装です。

to-report argmax2 [arguments f] 
    if length arguments = 0 [ show "incorrect length of arguments" report nobody] 
    let max-argument first arguments 
    let max-evaluation runresult f max-argument 

    foreach arguments 
    [ 
    let current-evaluation runresult f ? 
    if current-evaluation > max-evaluation 
    [ 
     set max-argument ? 
     set max-evaluation current-evaluation 
    ] 
    ] 
    report max-argument 
end 

私の質問は:組み込み関数を使用することによるメリットはありますか?私のmap/reduceコードでは、map/reduceを使用しないときに、一度反復処理を行うのに比べてリストを2回反復処理します。 Pythonでは、map/reduceはPythonバイトコードではなくCにコンパイルされるので、スピードアップになります。 netlogoに相当するものはありますか?

思考?

+1

私はこのケースでは一つの方法または他のを推測することを躊躇します。インタプリタのオーバーヘッドは 'foreach'の場合よりも高くなりますが、' reduce'バージョンでは一時的なリストがたくさんあります。もし賭けが強制されれば、私は「還元」が勝つと思うだろう。 –

答えて

1

あなたはmapを取り除くことができます:

to-report argmax [#args #f] 
    let _x0 first #args 
    let _best (list _x0 (runresult #f _x0)) 
    set _best reduce 
    [update ?1 ?2 #f] 
    fput _best butfirst #args 
    report first _best 
end 

to-report update [#xf #x #f] 
    let _f0 last #xf 
    let _f1 (runresult #f #x) 
    report ifelse-value (_f1 > _f0) [list #x _f1] [#xf] 
end 

to test ;to illustrate 
    let _xs n-values 10 [?] 
    show argmax _xs task [(- ?) * ?] 
end 
+0

ニース。しかし、引数リストを反復するだけの場合と比較して、パフォーマンスの向上はありますか? – mattsap

+0

時間を計ることができます。今度は両方が1つのループになっているので、私は基本的には関数を取得し続ける必要がない、削減によるわずかな利点が期待されます。しかし、おそらくJVMに依存しています。 – Alan

+0

正直言って、私はそれらのタイミングを避けようとしています。なぜなら、JVMがどのように動作するか/マイクロベンチマークを適切に行う方法についての知識がないためです。ここを参照してくださいhttp://stackoverflow.com/q/504103/4379026。私はあなたの期待は合理的だと思う...私は誰かが確認するようにしたいと思います。 – mattsap

関連する問題