42 votes

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

Je travaille dans le domaine de l'apprentissage automatique avec des ensembles de données assez volumineux (ils tiennent toujours dans la mémoire) et j'ai écrit certains calculs en R que je trouve trop lents. J'aimerais donc remplacer les "parties critiques" du programme par du code compilé que j'appellerais depuis 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 le Fortran ou le C++ pour faire cela ? Je n'ai besoin de travailler qu'avec des vecteurs ou des matrices numériques. Ce qui m'intéresse, c'est de savoir quel langage est le plus facile à apprendre et à interfacer avec R. Je ne me soucie pas vraiment de savoir lequel est le plus beau sur mon CV.

J'ai lu le manuel des extensions R et j'ai joué un peu avec le paquetage en ligne avec du code Fortran et C++ simple. Mon impression actuelle est que Fortran95 serait plus simple à apprendre, bien que le paquet Rcpp semble également très intéressant. Je connais actuellement R, Python et Matlab.

41voto

J'écris un peu de Fortran, beaucoup de Matlab, et j'ai récemment commencé à apprendre sérieusement le C++. Je pense que vous serez plus rapidement productif dans votre nouveau langage si vous optez pour Fortran plutôt que pour C++. Je vous suggère de garder cela à l'esprit :

  • Je suppose que la plupart des calculs que vous souhaitez effectuer consistent à traiter de grands tableaux de chiffres. Fortran est très bon dans ce domaine et possède des constructions de langage fondamentales et des fonctions intrinsèques pour les opérations sur des tableaux entiers (pas toujours plus performantes que les boucles, remarquez). Le C++ ne dispose pas de ces fonctions, vous devez soit les programmer vous-même, soit utiliser une bibliothèque telle que Boost (fortement recommandée par des personnes bien plus compétentes que moi).
  • Un grand nombre des caractéristiques qui font du C++ un langage attrayant pour un large éventail de types d'applications (des caractéristiques telles que les modèles, tous les trucs OO, les pointeurs, les références, et plus encore) ne sont pas terriblement utiles dans votre domaine. Je pense que si vous avez besoin de faire de la Je pense que si vous avez besoin de faire de la programmation "intelligente", vous le ferez en R, laissant Fortran pour les tâches simples et lourdes. Fortran possède également la plupart de ces fonctionnalités, mais elles ne sont pas aussi largement utilisées dans la communauté Fortran.
  • L'état d'esprit de Fortran n'est pas très éloigné de celui de Matlab, de sorte que le passage du second au premier n'est pas énorme. Pour l'instant, je pense aussi qu'apprendre suffisamment de Fortran pour être productif dans votre domaine sera plus rapide que d'apprendre suffisamment de C++.
  • Quant aux performances relatives de Fortran et de C++ : ne croyez rien à moins d'avoir des mesures sous les yeux. Mais je pense qu'il faut travailler dur et intelligemment pour que C++ atteigne les performances de Fortran. C'est certainement possible, mais je pense que c'est plus exigeant pour les compétences du programmeur. Les compilateurs Fortran ont fait l'objet de plus de 50 ans de travail et l'optimisation de la vitesse d'exécution est très importante pour les programmeurs Fortran.

Je ne peux pas du tout me prononcer sur la facilité d'intégration de R et de Fortran ou C++.

20voto

Dirk Eddelbuettel Points 134700

Si vous écrivez vous-même tout le code, cela peut dépendre du langage que vous préférez ou que vous pouvez apprendre mieux et plus rapidement. Bien que Rcpp peut vous donner l'avantage d'obtenir des objets R vers C++ et inversement plus facilement. De plus, les ajouts les plus récents de la version 0.8.3 permettent d'utiliser des expressions vectorielles similaires à celles de R en code compilé.

D'un autre côté, si vous prévoyez d'utiliser / de réutiliser / d'adapter des bibliothèques existantes, alors je jetterais un coup d'œil attentif à par exemple mloss.org et voyez quel langage vous fournit les bibliothèques d'apprentissage automatique les plus utiles et laissez cela guider votre décision.

Pour moi, le C++ fournit des abstractions plutôt utiles. plus l'accès à une énorme base de code de bonne qualité générale. Mais d'autres se contentent de Fortran. Cela dépend vraiment de vous et, dans une certaine mesure, des personnes qui vous entourent et qui peuvent vous aider.

16voto

Sharpie Points 6291

Fortran a été le premier langage de programmation que j'ai appris. Depuis, j'ai également appris le C et un peu de C++. Je dirais que si vous avez besoin d'accélérer rapidement le traitement d'une matrice, optez sans hésiter pour Fortran. Les raisons en sont les suivantes :

  • Fortran est très performant pour traiter efficacement les données numériques, en particulier lorsqu'elles sont stockées dans des matrices ou des tableaux. Ce type de travail est le "point fort" du langage.

  • Le Fortran étant axé sur les opérations numériques, sa courbe d'apprentissage est plus courte que celle du C et du C++. Il y a moins de caractéristiques du langage et de bizarreries à apprendre et vous n'avez pas à vous occuper des pointeurs. C'est une grande victoire si tout ce que vous voulez faire est d'accélérer certains calculs aussi vite que possible et de poursuivre votre travail.

  • Les tableaux multidimensionnels et les opérations sur les tableaux sont des citoyens de première classe dans le langage Fortran. En C ou C++, vous devez vous préoccuper de l'utilisation de bibliothèques externes ou de l'écriture de fonctions/macros pour obtenir la même fonctionnalité.

D'autre part, C et C++ sont décidément mieux adaptés aux tâches de programmation générale en dehors du domaine du calcul numérique. Si vous envisagez la possibilité de manipuler beaucoup de chaînes de caractères dans votre avenir, vous devriez probablement investir votre temps dans un langage autre que Fortran.

Mise à jour

Un autre élément important à prendre en compte est la manière dont vos données sont stockées et traitées du côté de la R. Si vous utilisez fortran, vous devrez transmettre vos données aux routines compilées de manière très basique - scalaires, vecteurs, etc. Pas de listes ou d'objets fantaisistes.

Comme R est implémenté en C, il existe une interface plus riche qui vous permet de passer directement des objets R arbitraires à des routines C et C++ et de renvoyer des objets R arbitraires. Vous pouvez également exécuter des callbacks qui vous permettent d'exécuter des fonctions R à partir du code C compilé.

14voto

Matti Pastell Points 4244

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 en Fortran et en C++ et je l'ai appelée depuis R.

Pour commencer, je pense que toute personne confrontée à ce problème devrait lire Écriture d'extensions R , Introduction à Rcpp y FAQ Rcpp .

J'ai maintenant découvert quelques points importants concernant l'interfaçage du code à partir de R qui n'ont pas encore été couverts dans les réponses :

  • Rcpp avec le package inline rend l'appel de C++ depuis R extrêmement facile et se charge même de la compilation de l'extension (voir la FAQ Rcpp), vous pouvez spécifier tout ce que vous voulez mettre dans la fonction et ce que vous ne voulez pas en retirer.
  • L'utilisation de Rcpp et RcppArmadillo permet d'écrire des calculs efficaces et de les appeler à partir de R très facilement avec des connaissances de base en C++.
  • L'interface de R avec Fortran ".Fortran" est beaucoup plus limitée, vous devez utiliser une sous-routine pour le faire et vous devez passer tous les paramètres que vous voulez obtenir. C'est-à-dire (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 le sous-programme retourne également tous les paramètres. Ce n'est pas si difficile, mais beaucoup plus sujet aux erreurs, fastidieux et limité.
  • Si vous voulez écrire un paquetage portable, vous devez utiliser F77, cf. ici.

En conclusion, pour ce dont j'ai besoin, écrire en Fortran et en C++ (avec Armadillo) semble aussi facile (ou difficile), mais interfacer le code C++ depuis R est beaucoup plus facile avec Rcpp.

5voto

f.jamitzky Points 176

Fortran est le java du HPC. Vous pouvez écrire des programmes très efficaces en C++, mais il est plus facile d'écrire le même programme en Fortran, pour autant qu'il soit adapté au calcul. Personne n'aurait l'idée d'écrire une application graphique en Fortran, mais dans le domaine du calcul intensif, il est imbattable en termes de vitesse et de concision.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X