Подтвердить что ты не робот

Должен ли я изучить Fortran или С++ для расширения R?

Я работаю с машинным обучением с довольно большими наборами данных (они по-прежнему вписываются в память), и я написал некоторые вычисления в R, которые я считаю слишком медленными. Таким образом, я хотел бы заменить "критические части" программы на скомпилированный код, который я бы назвал из R. Примерная проблема, которую я имею в руках, заключается в реализации алгоритм с обратной связью.

Мой вопрос: должен ли я изучать Fortran или С++ для этого? Мне нужно только работать с числовыми векторами или матрицами. В основном меня интересует, какой язык легче изучать и взаимодействовать с R, и мне все равно, какой из них лучше выглядит на моем резюме.

Я прочитал инструкцию по расширению R и немного поиграл с встроенным пакетом с помощью простого кода Fortran и С++. Мое настоящее впечатление в том, что Fortran95 будет проще узнать, хотя пакет Rcpp также выглядит очень интересным. В настоящее время я знаю R, Python и Matlab.

4b9b3361

Ответ 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 действительно хорош в пережевывании чисел.