Devrais-je apprendre Fortran ou C ++ pour étendre R?

Je travaille avec l’apprentissage automatique avec des ensembles de données assez volumineux (ils tiennent toujours en mémoire) et j’ai écrit des calculs dans R que je trouve trop lents. Je voudrais donc remplacer les “parties critiques” du programme par du code compilé que j’appellerais de R. Un exemple de problème que j’ai en main est l’implémentation de l’ algorithme “forward-backward” .

Ma question est de savoir si je dois apprendre Fortran ou C ++ pour le faire? Je n’ai besoin que de travailler avec des vecteurs ou des masortingces numériques. Je m’intéresse principalement à la langue qui est plus facile à apprendre et à l’interface de R et je ne me soucie pas vraiment de savoir lequel a le meilleur aspect sur mon CV.

J’ai lu le manuel des extensions R et joué un peu avec le paquet en ligne avec quelques simples codes Fortran et C ++. J’ai l’impression que Fortran95 serait plus simple à apprendre, bien que le package Rcpp soit également très intéressant. Je connais actuellement R, Python et Matlab.

Si vous écrivez tout le code vous-même, cela dépendra peut-être de la langue que vous préférez, ou peut apprendre mieux / plus rapidement. Bien que Rcpp puisse vous aider à récupérer plus facilement les objects R en C ++. En outre, les ajouts les plus récents dans 0.8.3 vous donnent des expressions vectorielles semblables à R dans le code compilé.

D’un autre côté, si vous envisagez d’utiliser / réutiliser / adapter des bibliothèques existantes, je consulterais par exemple mloss.org pour voir quelle langue vous fournit les bibliothèques d’apprentissage automatique les plus utiles et qui vous guideront également.

Pour moi, le C ++ fournit des abstractions plutôt utiles, ainsi qu’un access à une base de code énorme de bonne qualité générale. Mais d’autres se contentent de Fortran. Cela dépend vraiment de vous et, pour certains, étendre les personnes autour de vous qui peuvent apporter leur soutien.

J’écris pas mal de Fortran, beaucoup de Matlab, et récemment commencé à apprendre sérieusement le C ++. Je pense que vous serez plus productif dans votre nouvelle langue si vous utilisez Fortran plutôt que C ++. Je suggère ceci en gardant à l’esprit:

  • Je suppose que la plupart des calculs que vous voulez effectuer consistent à traiter de grands tableaux de nombres. Fortran est très doué pour cela et possède des constructions de langage fondamentales et des fonctions insortingnsèques pour les opérations sur tout le tableau (pas toujours plus performantes que les boucles). C ++ manque ces fonctionnalités, vous devez soit les programmer vous-même, soit utiliser une bibliothèque telle que Boost (fortement recommandé par des personnes bien plus compétentes que moi).
  • Un grand nombre des fonctionnalités qui font du langage C ++ un langage attrayant pour un large éventail de types d’applications (fonctionnalités telles que les modèles, tous les éléments OO, pointeurs, références, etc.) ne sont pas très utiles dans votre domaine. Je pense que si vous avez besoin de faire une programmation «intelligente», vous le ferez en R, laissant Fortran pour le simple levage de charges lourdes. Fortran possède également la plupart de ces fonctionnalités, mais elles ne sont pas très utilisées dans la communauté Fortran.
  • La mentalité Fortran n’est pas loin de la mentalité Matlab, donc le saut de ce dernier vers le premier n’est pas énorme. En ce moment aussi, je pense que l’apprentissage de Fortran pour être productif dans votre domaine sera plus rapide que d’apprendre suffisamment de C ++.
  • Quant à la performance relative de Fortran et C ++: ne croyez rien à moins que vous ayez des mesures devant vous. Mais je pense que vous devez travailler dur et intelligent pour que C ++ corresponde aux performances de Fortran. Cela peut certainement être fait, mais je pense que c’est plus exigeant pour les compétences du programmeur. Les compilateurs Fortran ont travaillé sur plus de 50 ans et l’optimisation de la vitesse d’exécution est très importante pour les programmeurs Fortran.

Je ne peux pas faire de commentaire sur la facilité d’intégration de R et Fortran ou C ++

Fortran a été le premier langage de programmation que j’ai appris, depuis lors, j’ai aussi choisi C et du C ++. Mes deux cents, c’est que si vous avez besoin d’accélérer rapidement le traitement de la masortingce, optez pour Fortran. Les raisons sont les suivantes:

  • Fortran est vraiment efficace pour traiter efficacement des données numériques, en particulier lorsqu’il est stocké dans des masortingces ou des tableaux. Ce type de travail est la «tache douce» de la langue.

  • Fortran se concentrant sur les opérations numériques, sa courbe d’apprentissage est inférieure à celle du C et du C ++. Il y a moins de fonctionnalités de langue et de bizarreries à apprendre et vous n’avez pas à gérer les pointeurs. C’est une grande victoire si tout ce que vous voulez faire est d’accélérer certains calculs le plus rapidement possible et de poursuivre votre travail.

  • Les tableaux multidimensionnels et les opérations sur les tableaux sont des citoyens de premier ordre dans la langue Fortran. Avec C ou C ++, vous devez vous préoccuper de l’utilisation de bibliothèques externes ou de fonctions / macros d’écriture pour fournir les mêmes fonctionnalités.

En revanche, C et C ++ sont nettement mieux adaptés aux tâches de programmation générales en dehors du domaine du calcul numérique. Si vous voyez la possibilité de manipuler des chaînes de caractères dans votre futur, vous voudrez probablement investir votre temps dans une langue autre que Fortran.

Mettre à jour

Une autre considération importante est la manière dont vos données sont stockées et traitées du côté R. Si vous utilisez fortran, vous devrez transmettre vos données aux routines compilées de manière très simple: scalaires, vecteurs, etc. Aucune liste ou object de fantaisie.

Comme R est implémenté dans C, une interface plus riche est disponible pour vous permettre de passer directement des objects R arbitraires aux routines C et C ++, puis de renvoyer des objects R arbitraires. Vous pouvez également exécuter des rappels vous permettant d’exécuter des fonctions R à partir du code C compilé.

J’ai maintenant fait quelques expériences en utilisant Fortran, C ++ et R et je pense que je suis au moins à moitié prêt à répondre à ma propre question maintenant. J’ai fini par écrire la fonction diff (et quelques autres petits tests) à la fois dans Fortran et C ++ et l’appeler de R.

Pour les débutants, je pense que toute personne confrontée à ce problème devrait lire les extensions R , Rcpp et Rcpp .

J’ai maintenant découvert quelques points importants sur l’interfaçage du code de R qui n’ont pas encore été abordés dans les réponses:

  • Rcpp avec le paquet en ligne rend l’appel de C ++ à partir de R extrêmement facile et prend même soin de comstackr l’extension (voir la FAQ de Rcpp), vous pouvez spécifier tout ce que vous voulez aller dans la fonction et ce que vous voulez faire.
  • L’utilisation de Rcpp et RcppArmadillo permet d’écrire des calculs efficaces et de les appeler très facilement à partir de R avec des connaissances très basiques en C ++.
  • L’interface R pour Fortran “.Fortran” est beaucoup plus limitée, vous devez utiliser une sous-routine pour le faire et vous devez transmettre tous les parameters que vous ne voulez pas sortir. C’est (si je comprends bien) que vous devez pré-allouer et passer également le (s) vecteur (s) de résultat (ou tableau) au sous-programme et que le sous-programme retourne également tous les parameters. Ce n’est pas si difficile, mais beaucoup plus sujet aux erreurs, fastidieux et limité.
  • Si vous souhaitez écrire un paquet portable, vous devez utiliser F77, voir ici.

Donc, en guise de conclusion: pour ce que j’ai besoin d’écrire, Fortran et C ++ (avec Armadillo) semblent ~ aussi faciles (ou difficiles), mais l’interfaçage du code C ++ avec R est beaucoup plus facile avec Rcpp.

Fortran est le java de HPC. Vous pouvez écrire des programmes très efficaces en C ++, mais il est plus facile d’écrire le même programme dans Fortran, à condition qu’il soit adapté au traitement des nombres. Personne n’écrirait sérieusement une application graphique dans Fortran, mais dans HPC, la vitesse et la concision sont imbattables.

Si vous êtes dans le milieu universitaire, beaucoup de gens utilisent encore Fortran, alors cela pourrait être un avantage. Et Fortran est vraiment doué pour mâcher les chiffres.