Я работаю с машинным обучением с довольно большими наборами данных (они все еще умещаются в памяти), и я записал некоторые вычисления в R, который я нахожу, чтобы быть слишком медленным. Таким образом я хотел бы заменить "критические части" программы со скомпилированным кодом, который я назову от R. Проблема в качестве примера, которую я имею в руке, реализует алгоритм "прямого-обратного" хода.
Мой вопрос состоит в том, должен ли я изучить Фортран или C++, чтобы сделать это? Я только должен работать с числовыми векторами или матрицами. Мне главным образом интересно, в котором язык легче учиться и взаимодействовать через интерфейс от R, и я действительно не забочусь, какой выглядит лучше на моем CV.
Я прочитал руководство расширений R и играл немного со встроенным пакетом с некоторым простым Фортраном и кодом C++. Мое текущее впечатление - то, что Fortran95 был бы более прост учиться, хотя пакет Rcpp также выглядит очень интересным. Я в настоящее время знаю R, Python и Matlab.
Если вы будете писать весь код самостоятельно, то это может зависеть от того, какой язык вам больше нравится, или вы можете выучить его лучше/быстрее. Хотя Rcpp может дать вам преимущество в том, чтобы легче переводить объекты R в C++ и обратно. Кроме того, последние дополнения в 0.8.3 дают вам R-подобные векторные выражения в скомпилированном коде.
С другой стороны, если вы планируете использовать / повторно использовать / адаптировать существующие библиотеки, то я бы внимательно изучил например, mloss.org и посмотрел, какой язык предоставляет вам наиболее полезные библиотеки машинного обучения, и руководствовался бы этим при принятии решения.
Для меня C++ предоставляет довольно полезные абстракции плюс доступ к огромной базе кода общего хорошего качества. Но другие довольствуются Фортраном. Это действительно зависит от вас, и, в некоторой степени, от людей вокруг вас, которые могут оказать поддержку.
Я немного пишу на Fortran, много Matlab, а недавно начал серьезно изучать C ++. Я думаю, что вы быстрее освоите новый язык, если будете использовать Fortran, а не C ++. Я предлагаю иметь в виду следующее:
Я вообще не могу комментировать простоту интеграции R и Fortran или C ++
Фортран был первым языком программирования, который я выучил, с тех пор я также взял C и немного C ++. Мои два цента в том, что если вам нужно быстро ускорить обработку матрицы, обязательно идите с Fortran. Причины следующие:
Фортран действительно хорош в эффективной обработке числовых данных, особенно когда он хранится в матрицах или массивах. Такого рода работа является «сладким пятном» языка.
Поскольку Fortran имеет узкий фокус на числовых операциях, он имеет более низкую кривую обучения по сравнению с C и C ++. Есть меньше языковых функций и причуд для изучения, и вам не нужно иметь дело с указателями. Это большая победа, если все, что вы хотите сделать, это ускорить некоторые вычисления как можно быстрее и двигаться дальше в своей работе.
Многомерные массивы и операции с массивами являются первыми:класс граждан на фортранском языке. С C или C++ вам нужно беспокоиться об использовании внешних библиотек или написании функций / макросов для обеспечения той же функциональности.
С другой стороны, C и C++ определенно лучше подходят для задач программирования общего назначения за пределами области численных вычислений. Если вы видите возможность для чего-то вроде множества манипуляций со строками в вашем будущем, то вы, вероятно, захотите инвестировать свое время в язык, отличный от Fortran.
Update
Еще одним важным соображением является то, как ваши данные хранятся и обрабатываются на стороне R. Если вы используете fortran, то вам придется передавать свои данные в скомпилированные процедуры очень простым способом - скаляры, векторы и т. Д. Никаких списков или причудливых объектов.
Поскольку R реализован на C, существует более богатый интерфейс, который позволяет напрямую передавать произвольные объекты R в процедуры C и C++, а затем возвращать произвольные объекты R. Можно также выполнять обратные вызовы, которые позволяют выполнять функции R из скомпилированного кода C.
Фортран - это Java HPC. Вы можете писать очень эффективные программы на C ++, но легче написать ту же программу на Fortran, если она подходит для обработки чисел. Никто всерьез не станет писать приложение с графическим интерфейсом на Фортране, но в HPC оно непревзойденно по скорости и лаконичности.
Сейчас я провел несколько экспериментов с использованием Fortran, C++ и R и думаю, что теперь я, по крайней мере, наполовину готов ответить на свой вопрос. В итоге я написал функцию diff (и некоторые другие небольшие тесты) на Фортране и C++ и вызвал ее из R.
Для начала, я думаю, любому, кто столкнулся с этой проблемой, стоит прочитать Написание расширений R, Введение в Rcpp и FAQ по Rcpp.
Сейчас я обнаружил несколько важных моментов о взаимодействии кода из R, которые еще не были освещены в ответах:
Итак, вывод: для того, что мне нужно, написание Fortran и C++ (с Armadillo) кажется ~ одинаково легким (или трудным), но взаимодействие с C++ кодом из R намного проще с Rcpp.
Если вы работаете в академических кругах, многие люди все еще используют Фортран, так что это может быть хорошим плюсом. А фортран действительно хорошо пережевывает числа.