@A_Degteryov

Каков наиболее простой путь радикального ускорения кода на R?

Я не программист, а учёный, использую R для разработки новых алгоритмов и проведения вычислительных экспериментов. В плане скорости воплощения идей в готовые инструменты, подготовки какой-то нестандартной научной графики R просто превосходен и не перестаёт радовать. Но в некоторых случаях, особенно при достаточно массивных вычислениях, скорость исполнения кода удручает. Всё уже распараллелено, используются самые быстрые конструкции, но похоже это предел. Циклы использовать нельзя, всё приходится превращать в ломающие мозг и крайне неудобные для отладки future_apply и аналоги, но и их скорости уже не хватает. Куда стоит двигаться? Как обычно, хочется минимальными усилиями получить максимальный результат. Пока вижу варианты:
  1. Rcpp – насколько понимаю, это самый популярный путь, когда не хватает скорости. В плане технологии вопросов нет, вроде бы есть пошаговые инструкции и всё должно работать. Но не очень привлекает, что придётся изучать второй язык и потом поддерживать код сразу на двух языках. Я и так не очень-то программист, основные рабочие задачи никто не отменял, так что времени плотно заниматься этим скорее всего не будет. Насколько я понимаю, С++ достаточно сложен в плане получения оптимального кода, так что для того, чтобы действительно добиться ускорения критических мест может потребоваться значительное время.
  2. Вставка функций на Fortran. Не самое популярное решение, но вроде бы тоже есть какие-то инструкции, как запустить. Так же, как и с С++, в наличии все проблемы изучения второго языка и сопровождения двуязычного кода. Привлекает, что если немного разобраться с основами, то скорее всего достаточно быстро удастся получить приемлемый по производительности код, не вникая особо в какие-то программистские нюансы. Собственно, это было и остаётся основной особенностью языка, из-за которой его используют в научных расчётах. Не привлекает, что если возникнут проблемы, мало у кого можно спросить совета, сообщества уже особенно-то и нет. Ну и вообще, изучение фортрана сегодня сложно воспринимать как инвестицию в будущее.
  3. Julia. Красивый современный язык, гораздо более привлекательный в плане изучения, чем Fortran. К самому языку никаких вопросов нет, но в плане экосистемы пока что откровенно сыроват. Советы из сети и код из книжек зачастую уже не работают, опытных «гуру», у которых можно узнать правильные ответы, пока ещё очень мало. Пробовал вызывать Julia из R и через XRJulia, и чрез JuliaCall, но так и не смог заставить это работать. Возможно через какое-то время появятся новые рабочие способы как их связать, но пока что такая связка выглядит не очень надёжной. А переходить полностью на Julia – значит выбрасывать весь свой опыт, который есть с R. Можно вызывать R из Julia, это работает, но это уже самый крайний случай. Ну и по скорости – чтобы получить на Julia код, как-то сопоставимый по скорости с С++ или Fortran, нужно очень постараться. Получается далеко не у всех. Как рубашка на вырост Julia возможно и неплохой вариант, но если хочется скорости здесь и сейчас, то не уверен, что это лучшее, что можно придумать.

Какие есть идеи?
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Amirullo
"используются самые быстрые конструкции" - точно? я никого не знаю, кто бы мог такое сказать про свой код =)
Ваши предложения по оптимизации кажутся мне очень страшными. не легче ли перейти на питон, если вы уже такие сложные решения рассматриваете?
А данные ваши где хранятся? Надеюсь, в data.table? очень-очень быстрый. и там есть пространство для дальнейшей оптимизации. Крайне поверхностное предложение, но все же, может поможет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы