Я рассматриваю возможность использования argmax с использованием (map and reduce) и итерации.Уменьшение, карта и итерации: Эффективность
Вот моя реализация с помощью карты и уменьшить:
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. В python map/reduce будет ускоряться, поскольку он компилируется в C, а не в байтовом коде python. Есть ли эквивалент для netlogo?
Мысли?
я постеснялся бы угадать одну или другую в этом случае. Накладные расходы переводчика выше в случае 'foreach' здесь, но версия' reduce' делает много временных списков. Если бы я сделал ставку, я бы подумал, что «уменьшить» победит. –