Должен ли я изучить Fortran или С++ для расширения R?
Я работаю с машинным обучением с довольно большими наборами данных (они по-прежнему вписываются в память), и я написал некоторые вычисления в R, которые я считаю слишком медленными. Таким образом, я хотел бы заменить "критические части" программы на скомпилированный код, который я бы назвал из R. Примерная проблема, которую я имею в руках, заключается в реализации алгоритм с обратной связью.
Мой вопрос: должен ли я изучать Fortran или С++ для этого? Мне нужно только работать с числовыми векторами или матрицами. В основном меня интересует, какой язык легче изучать и взаимодействовать с R, и мне все равно, какой из них лучше выглядит на моем резюме.
Я прочитал инструкцию по расширению R и немного поиграл с встроенным пакетом с помощью простого кода Fortran и С++. Мое настоящее впечатление в том, что Fortran95 будет проще узнать, хотя пакет Rcpp также выглядит очень интересным. В настоящее время я знаю R, Python и Matlab.
Ответы
Ответ 1
Если вы будете писать весь код самостоятельно, это может зависеть от того, какой язык вам больше нравится, или может учиться лучше/быстрее. Хотя Rcpp может дать вам преимущество в том, что R объектов на С++ и обратно легче. Кроме того, самые последние дополнения в 0.8.3 дают вам R-подобные векторные выражения в скомпилированном коде.
С другой стороны, если вы планируете использовать/повторно использовать/адаптировать существующие библиотеки, тогда я бы неплохо посмотрел, например. mloss.org и посмотрите, какой язык предоставляет вам наиболее полезные библиотеки для машинного обучения, и это также поможет вашему решению.
Для меня С++ предоставляет довольно полезные абстракции плюс доступ к огромной кодовой базе общего хорошего качества. Но другие довольны Фортраном. Это действительно зависит от вас, а также от людей, которые могут оказать поддержку.
Ответ 2
Я пишу честный бит Fortran, много Matlab, и недавно начал серьезно изучать С++. Я думаю, что вы будете более продуктивны на своем новом языке раньше, если поедете с Fortran, а не с С++. Я предлагаю это иметь в виду:
- Я предполагаю, что большая часть числа хрустов, которые вы хотите сделать, это обработка больших массивов чисел. Fortran очень хорош в этом и имеет основополагающие языковые конструкции и встроенные функции для операций с целым массивом (не всегда лучше, чем циклы). С++ пропускает эти функции, вам либо нужно запрограммировать их самостоятельно, либо использовать такую библиотеку, как Boost (настоятельно рекомендуется людьми, гораздо более осведомленными, чем я).
- Многие функции, которые делают С++ привлекательным языком для большого числа типов приложений (такие функции, как шаблоны, все элементы OO, указатели, ссылки и т.д.), не очень полезны в вашем домене. Я подозреваю, что если вам нужно
"умное" программирование вы сделаете это в R, оставив Fortran для простой тяжелой атлетики. У Fortran также есть большинство этих функций, но они не так широко используются в коммуникациях Fortran.
- Фортранский менталитет находится недалеко от мышления Матлаба, поэтому прыжок от последнего к первому не огромен. Прямо сейчас, я считаю, что обучение достаточно Fortran, чтобы быть продуктивным в вашем домене, будет быстрее, чем достаточно для обучения С++.
- Что касается относительной производительности Fortran и С++: ничего не верьте, если у вас нет измерений перед вами. Но я думаю, что вам нужно усердно работать, чтобы заставить С++ соответствовать производительности Fortran. Это, безусловно, можно сделать, но я думаю, что это более требовательно к программистам. У составителей Fortran было более 50 лет работы над ними, и оптимизация для скорости выполнения очень важна для программистов Fortran.
Я вообще не могу комментировать о простоте интеграции R и Fortran или С++
Ответ 3
Fortran был первым языком программирования, который я изучил, с тех пор я также взял C и некоторые С++. Мои два цента - это то, что если вам нужно быстро ускорить обработку матрицы, обязательно перейдите к Fortran. Причины таковы:
-
Fortran действительно эффективен для эффективной обработки числовых данных, особенно когда он хранится в матрицах или массивах. Эта работа - это "сладкое пятно" языка.
-
Поскольку Fortran имеет узкий фокус на числовые операции, он имеет более низкую кривую обучения по сравнению с C и С++. Есть меньше особенностей языка и причуд, чтобы учиться, и вам не нужно иметь дело с указателями. Это большая победа, если все, что вы хотите сделать, это ускорить некоторые вычисления как можно быстрее и перейти к вашей работе.
-
Многомерные массивы и операции массива являются первоклассными гражданами на языке Fortran. С C или С++ вам нужно беспокоиться об использовании внешних библиотек или написании функций/макросов для обеспечения той же функциональности.
С другой стороны, C и С++ явно лучше подходят для задач общего назначения, не относящихся к области численных вычислений. Если вы видите возможность чего-то вроде многострочной манипуляции в будущем, то вы, вероятно, захотите инвестировать свое время на язык, отличный от Fortran.
Update
Еще одно важное соображение заключается в том, как ваши данные хранятся и обрабатываются на стороне R. Если вы используете fortran, вам придется передавать свои данные в скомпилированные подпрограммы в очень простой форме - скаляры, векторы и т.д. Нет списков или причудливых объектов.
Так как R реализовано на C, существует более богатый интерфейс, который позволяет вам напрямую передавать произвольные объекты R в подпрограммы C и С++, а затем возвращать произвольные объекты R. Вы также можете выполнять обратные вызовы, которые позволяют выполнять R-функции из скомпилированного кода C.
Ответ 4
Теперь я провел несколько экспериментов по использованию Fortran, С++ и R, и я думаю, что я по крайней мере наполовину готов ответить на свой вопрос. Я закончил писать функцию diff (и некоторые другие небольшие тесты) как в Fortran, так и в С++ и назвал ее с R.
Для начала я думаю, что любой, кто столкнулся с этой проблемой, должен читать Написание расширений R, Введение Rcpp и Часто задаваемые вопросы о Rcpp.
Теперь я обнаружил некоторые важные моменты, касающиеся взаимодействия кода из R, которые еще не были рассмотрены в ответах:
- Rcpp с встроенным пакетом упрощает вызов С++ из R и даже заботится о компиляции расширения (см. часто задаваемые вопросы о Rcpp), вы можете указать все, что вы не хотите входить в функцию, и то, что вы не хотите убирайся.
- Использование Rcpp и RcppArmadillo позволяет писать эффективные вычисления и очень легко обращаться к ним из R с очень фундаментальными знаниями С++.
- Интерфейс R к Fortran ".Fortran" гораздо более ограничен, вам нужно использовать подпрограмму, чтобы выполнить его, и вам нужно передать все параметры, в которых вы не сможете выйти. Это (как я понимаю), что вам нужно предварительно распределить и передать также вектор результата (или массив) в подпрограмму, и подпрограмма также вернет все параметры. Это не так сложно, но гораздо больше подвержено ошибкам, утомительным и ограниченным.
- Если вы не собираетесь писать переносной пакет, вам нужно использовать F77, см. здесь.
Итак, как вывод: для чего мне нужно писать Fortran и С++ (с Armadillo), кажется ~ одинаково легким (или сложным), но сопряжение кода С++ из R намного проще с Rcpp.
Ответ 5
Fortran - это Java HPC. Вы можете писать очень эффективные программы на С++, но легче написать одну и ту же программу в Fortran, если она подходит для хруста числа. Никто не будет серьезно писать графическое приложение в Фортране, но в HPC он непревзойден в скорости и лаконичности.
Ответ 6
Если вы находитесь в академических кругах, многие люди по-прежнему используют Fortran, поэтому это может быть хорошим плюсом. И fortran действительно хорош в пережевывании чисел.