2016-05-04 3 views
1

Я рассматриваю возможность использования 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?

Мысли?

+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

Nice. Но есть ли улучшение производительности по сравнению с простое повторение списка аргументов? – mattsap

+0

Вы могли бы их побывать. Теперь, когда они оба доходят до одного цикла, я бы ожидал небольшого преимущества от сокращения, что в принципе не должно будет продолжать получать функцию. Но это, вероятно, зависит от JVM. – Alan

+0

Честно говоря, я стараюсь избегать их, поскольку это не так просто из-за оптимизации, выполняемой под капотом, и моего незнания о том, как работает JVM/как правильно выполнять микро-бенчмарк. См. Здесь http://stackoverflow.com/q/504103/4379026. Я думаю, ваши ожидания разумны, хотя ... Я бы хотел, чтобы кто-то подтвердил это. – mattsap

Смежные вопросы