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