Я должен изучить Фортран или C++ для расширения R? [закрытый]

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

Мой вопрос состоит в том, должен ли я изучить Фортран или C++, чтобы сделать это? Я только должен работать с числовыми векторами или матрицами. Мне главным образом интересно, в котором язык легче учиться и взаимодействовать через интерфейс от R, и я действительно не забочусь, какой выглядит лучше на моем CV.

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

42
задан Switch 30 December 2015 в 16:59
поделиться

6 ответов

Если вы будете писать весь код самостоятельно, то это может зависеть от того, какой язык вам больше нравится, или вы можете выучить его лучше/быстрее. Хотя Rcpp может дать вам преимущество в том, чтобы легче переводить объекты R в C++ и обратно. Кроме того, последние дополнения в 0.8.3 дают вам R-подобные векторные выражения в скомпилированном коде.

С другой стороны, если вы планируете использовать / повторно использовать / адаптировать существующие библиотеки, то я бы внимательно изучил например, mloss.org и посмотрел, какой язык предоставляет вам наиболее полезные библиотеки машинного обучения, и руководствовался бы этим при принятии решения.

Для меня C++ предоставляет довольно полезные абстракции плюс доступ к огромной базе кода общего хорошего качества. Но другие довольствуются Фортраном. Это действительно зависит от вас, и, в некоторой степени, от людей вокруг вас, которые могут оказать поддержку.

20
ответ дан 26 November 2019 в 23:32
поделиться

Я немного пишу на Fortran, много Matlab, а недавно начал серьезно изучать C ++. Я думаю, что вы быстрее освоите новый язык, если будете использовать Fortran, а не C ++. Я предлагаю иметь в виду следующее:

  • Я полагаю, что большая часть работы с числами, которую вы хотите выполнить, - это обработка больших массивов чисел. Фортран очень хорош в этом и имеет фундаментальные языковые конструкции и встроенные функции для операций с целым массивом (не всегда лучше, чем циклы, заметьте). В C ++ эти функции отсутствуют, вам либо придется программировать их самостоятельно, либо использовать такую ​​библиотеку, как Boost (настоятельно рекомендуется людьми, гораздо более осведомленными, чем я).
  • Многие функции, которые делают C ++ привлекательным языком для большого диапазона типов приложений (такие как шаблоны, все объекты объектно-ориентированного программирования, указатели, ссылки и т. Д.), Не очень полезны в вашей области. Я подозреваю, что если тебе понадобится что-нибудь «умное» программирование, вы будете делать это на R, оставив Фортран для простой и тяжелой работы. В Фортране тоже есть большинство из этих функций, но они не так широко используются в сообществе Фортран.
  • Мышление Fortran недалеко от мышления Matlab, поэтому скачок от последнего к первому не велик. Прямо сейчас я тоже считаю, что изучение Фортрана, достаточное для продуктивной работы в вашей области, будет быстрее, чем изучение достаточного количества C ++.
  • Что касается относительной производительности Fortran и C ++: ни во что не верьте, если перед вами нет измерений. Но я думаю, что вам нужно много и умно работать, чтобы заставить C ++ соответствовать производительности Fortran.Конечно, это можно сделать, но я думаю, что это требует больше навыков программиста. Компиляторы Fortran работали над ними более 50 лет, и оптимизация скорости выполнения очень важна для нас, программистов на Fortran.

Я вообще не могу комментировать простоту интеграции R и Fortran или C ++

41
ответ дан 26 November 2019 в 23:32
поделиться

Фортран был первым языком программирования, который я выучил, с тех пор я также взял C и немного C ++. Мои два цента в том, что если вам нужно быстро ускорить обработку матрицы, обязательно идите с Fortran. Причины следующие:

  • Фортран действительно хорош в эффективной обработке числовых данных, особенно когда он хранится в матрицах или массивах. Такого рода работа является «сладким пятном» языка.

  • Поскольку Fortran имеет узкий фокус на числовых операциях, он имеет более низкую кривую обучения по сравнению с C и C ++. Есть меньше языковых функций и причуд для изучения, и вам не нужно иметь дело с указателями. Это большая победа, если все, что вы хотите сделать, это ускорить некоторые вычисления как можно быстрее и двигаться дальше в своей работе.

  • Многомерные массивы и операции с массивами являются первыми:класс граждан на фортранском языке. С C или C++ вам нужно беспокоиться об использовании внешних библиотек или написании функций / макросов для обеспечения той же функциональности.

С другой стороны, C и C++ определенно лучше подходят для задач программирования общего назначения за пределами области численных вычислений. Если вы видите возможность для чего-то вроде множества манипуляций со строками в вашем будущем, то вы, вероятно, захотите инвестировать свое время в язык, отличный от Fortran.

Update

Еще одним важным соображением является то, как ваши данные хранятся и обрабатываются на стороне R. Если вы используете fortran, то вам придется передавать свои данные в скомпилированные процедуры очень простым способом - скаляры, векторы и т. Д. Никаких списков или причудливых объектов.

Поскольку R реализован на C, существует более богатый интерфейс, который позволяет напрямую передавать произвольные объекты R в процедуры C и C++, а затем возвращать произвольные объекты R. Можно также выполнять обратные вызовы, которые позволяют выполнять функции R из скомпилированного кода C.

16
ответ дан 26 November 2019 в 23:32
поделиться

Фортран - это Java HPC. Вы можете писать очень эффективные программы на C ++, но легче написать ту же программу на Fortran, если она подходит для обработки чисел. Никто всерьез не станет писать приложение с графическим интерфейсом на Фортране, но в HPC оно непревзойденно по скорости и лаконичности.

5
ответ дан 26 November 2019 в 23:32
поделиться

Сейчас я провел несколько экспериментов с использованием Fortran, C++ и R и думаю, что теперь я, по крайней мере, наполовину готов ответить на свой вопрос. В итоге я написал функцию diff (и некоторые другие небольшие тесты) на Фортране и C++ и вызвал ее из R.

Для начала, я думаю, любому, кто столкнулся с этой проблемой, стоит прочитать Написание расширений R, Введение в Rcpp и FAQ по Rcpp.

Сейчас я обнаружил несколько важных моментов о взаимодействии кода из R, которые еще не были освещены в ответах:

  • Rcpp с пакетом inline делает вызов C++ из R чрезвычайно простым и даже берет на себя компиляцию расширения (см. Rcpp FAQ), вы можете указать все, что вы не хотите вводить в функцию и что вы не хотите выводить.
  • Использование Rcpp и RcppArmadillo позволяет писать эффективные вычисления и вызывать их из R очень легко с базовыми знаниями C++.
  • Интерфейс R к Fortran ".Fortran" гораздо более ограничен, для этого нужно использовать подпрограмму и передавать в нее все параметры, которые вы не хотите получить на выходе. То есть (как я понимаю) вам нужно предварительно выделить и передать в подпрограмму вектор(ы) (или массив) результатов, а подпрограмма также возвращает все параметры. Это не так сложно, но гораздо более подвержено ошибкам, утомительно и ограничено.
  • Если вы не хотите писать переносимый пакет, вам нужно использовать F77, см. здесь.

Итак, вывод: для того, что мне нужно, написание Fortran и C++ (с Armadillo) кажется ~ одинаково легким (или трудным), но взаимодействие с C++ кодом из R намного проще с Rcpp.

14
ответ дан 26 November 2019 в 23:32
поделиться

Если вы работаете в академических кругах, многие люди все еще используют Фортран, так что это может быть хорошим плюсом. А фортран действительно хорошо пережевывает числа.

3
ответ дан 26 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: