Meilleures langues pour le calcul scientifique [fermé]

10

Il semble que la plupart des langues disposent d'un certain nombre de bibliothèques de calcul scientifique.

  • Python a Scipy
  • Rust a SciRust
  • C++a plusieurs, y compris ViennaCLetArmadillo
  • Javaa Java Numericset Coltainsi que plusieurs autres

Sans parler des langages comme Ret Juliaconçus explicitement pour le calcul scientifique.

Avec autant d'options, comment choisissez-vous la meilleure langue pour une tâche? De plus, quelles langues seront les plus performantes? Pythonet Rsemblent avoir le plus de traction dans l'espace, mais logiquement, un langage compilé semble être un meilleur choix. Et est-ce que quelque chose surpassera jamais Fortran? De plus, les langues compilées ont tendance à avoir une accélération GPU, tandis que les langues interprétées aiment Ret Pythonnon. Que dois-je prendre en compte lors du choix d'une langue et quelles langues offrent le meilleur équilibre entre utilité et performances? Y a-t-il également des langages avec des ressources informatiques scientifiques importantes que j'ai ratés?

ragingSloth
la source
12
Il ne fait aucun doute ici. Si vous avez besoin de faire des recherches fondamentales sur le langage de programmation, il vaut mieux lire Wikipedia que d'attendre que quelqu'un vienne ici pour pousser son cheval de bataille.
Dirk Eddelbuettel
@DirkEddelbuettel Très bon point. Je pensais qu'il valait mieux essayer de produire du contenu que de le raffiner à ce stade de la bêta, mais je ne connais pas beaucoup les bêtas SE. Était-ce une bonne décision de ma part ou non?
indico
1
Regardez ces chiffres.
Emre
@DirkEddelbuettel vous ne vous trompez pas, mais mon espoir était de favoriser une discussion sur les caractéristiques et les outils utiles associés aux différentes langues. Le langage que vous utilisez est un outil important en science des données, donc je pensais que les gens pouvaient discuter des outils qu'ils préféraient et de leurs avantages objectifs ici, en tant que ressource pour ceux qui cherchent à tenter un travail similaire.
ragingSloth
1
@indico Essayez cran.r-project.org/web/packages/overlap/index.html qui n'est que le premier que j'ai choisi au hasard. Mais vraiment, j'ai personnellement connu de nombreux statisticiens qui ont écrit des packages R. Aucun d'entre eux n'en a encore écrit un en python. Pour élargir un peu la conversation, kdnuggets.com/2013/08/… est intéressant.
Lembik

Réponses:

12

C'est une question assez massive, donc ce n'est pas censé être une réponse complète, mais j'espère que cela peut aider à éclairer la pratique générale autour de la détermination du meilleur outil pour le travail en matière de science des données. Généralement, j'ai une liste relativement courte de qualifications que je recherche en ce qui concerne n'importe quel outil dans cet espace. Dans aucun ordre particulier, ils sont:

  • Performance : Cela revient essentiellement à la rapidité avec laquelle le langage multiplie la matrice, car c'est plus ou moins la tâche la plus importante en science des données.
  • Évolutivité : au moins pour moi personnellement, cela se résume à la facilité de construction d'un système distribué. C'est quelque part où les langues comme Juliavraiment brillent.
  • Communauté : quelle que soit la langue, vous recherchez vraiment une communauté active qui peut vous aider lorsque vous êtes bloqué en utilisant l'outil que vous utilisez. C'est là que pythonse place très en avance sur la plupart des autres langues.
  • Flexibilité : rien n'est pire que d'être limité par la langue que vous utilisez. Cela n'arrive pas très souvent, mais essayer de représenter des structures de graphe dans haskellest une douleur notoire, et Juliaest rempli de beaucoup de douleurs d'architectures de code du fait d'être un langage si jeune.
  • Facilité d'utilisation : si vous souhaitez utiliser quelque chose dans un environnement plus vaste, vous devez vous assurer que la configuration est simple et qu'elle peut être automatisée. Rien de pire que d'avoir à mettre en place un build finnicky sur une demi-douzaine de machines.

Il existe une tonne d'articles sur les performances et l'évolutivité, mais en général, vous envisagez un écart de performances de 5 à 10 fois entre les langues, qui peut ou non avoir une importance en fonction de votre application spécifique. En ce qui concerne l'accélération GPU, cudamatc'est un moyen vraiment transparent de le faire fonctionner python, et la cudabibliothèque en général a rendu l'accélération GPU beaucoup plus accessible qu'elle ne l'était auparavant.

Les deux principales mesures que j'utilise pour la communauté et la flexibilité sont de regarder le gestionnaire de packages de la langue et les questions de langue sur un site comme SO. S'il y a un grand nombre de questions et réponses de haute qualité, c'est un bon signe que la communauté est active. Le nombre de packages et l'activité générale sur ces packages peuvent également être un bon proxy pour cette métrique.

En ce qui concerne la facilité d'utilisation, je suis fermement convaincu que la seule façon de le savoir est de le configurer vous-même. Il y a beaucoup de superstition autour de nombreux outils de science des données, en particulier des choses comme les bases de données et l'architecture informatique distribuée, mais il n'y a aucun moyen de vraiment savoir si quelque chose est facile ou difficile à configurer et à déployer sans simplement le construire vous-même.

indico
la source
Pour ajouter à cette réponse: en termes d'évolutivité, Scalaet Goméritent d'être mentionnés.
Marc Claesen
J'ajouterais de la clarté et de la brièveté (liées à la syntaxe et à l'architecture du langage, mais pas seulement). Être capable d'écrire rapidement et de lire sans douleur fait une énorme différence (car le temps des programmeurs est plus cher que le temps machine).
Piotr Migdal
5

La meilleure langue dépend de ce que vous voulez faire. Première remarque: ne vous limitez pas à une seule langue. Apprendre une nouvelle langue est toujours une bonne chose, mais à un moment donné, vous devrez choisir. Les facilités offertes par la langue elle-même sont une chose évidente à prendre en compte, mais à mon avis, les éléments suivants sont plus importants:

  • bibliothèques disponibles : devez-vous tout implémenter à partir de zéro ou pouvez-vous réutiliser des éléments existants? Notez que ces bibliothèques n'ont pas besoin d'être dans la langue que vous envisagez, tant que vous pouvez vous interfacer facilement. Travailler dans une langue sans accès à la bibliothèque ne vous aidera pas à faire avancer les choses.
  • nombre d'experts : si vous voulez des développeurs externes ou commencez à travailler en équipe, vous devez considérer combien de personnes connaissent réellement la langue. À titre d'exemple extrême: si vous décidez de travailler à Brainfuck parce que vous l'aimez, sachez que vous travaillerez probablement seul. Il existe de nombreuses enquêtes qui peuvent aider à évaluer la popularité des langues, y compris le nombre de questions par langue sur SO.
  • chaîne d'outils : avez-vous accès à de bons débogueurs, profileurs, outils de documentation et (si vous aimez ça) des IDE?

Je suis conscient que la plupart de mes remarques sont en faveur des langues établies. C'est dans une perspective de «faire avancer les choses».

Cela dit, je pense personnellement qu'il vaut beaucoup mieux devenir compétent dans une langue de bas niveau et une langue de haut niveau:

  • bas niveau: C ++, C, Fortran, ... à l'aide duquel vous pouvez implémenter certains points chauds de profilage uniquement si vous en avez besoin car le développement dans ces langages est généralement plus lent (bien que cela soit sujet à débat). Ces langues restent roi de la colline en termes de performances critiques et sont susceptibles de rester au top pendant longtemps.
  • haut niveau: Python, R, Clojure, ... pour «coller» des trucs ensemble et faire des trucs critiques non liés aux performances (prétraitement, traitement des données, ...). Je trouve cela important simplement parce qu'il est beaucoup plus facile de faire du développement rapide et du prototypage dans ces langages.
Marc Claesen
la source
4

Vous devez d'abord décider ce que vous voulez faire, puis chercher le bon outil pour cette tâche.

Une approche très générale consiste à utiliser R pour les premières versions et à voir si votre approche est correcte. Il manque un peu de vitesse, mais possède des commandes et des bibliothèques d'addons très puissantes, que vous pouvez essayer presque n'importe quoi avec: http://www.r-project.org/

La deuxième idée est que si vous voulez comprendre les algorithmes derrière les bibliothèques, vous voudrez peut-être jeter un œil aux recettes numériques. Ils sont disponibles pour différentes langues et peuvent être utilisés gratuitement pour l'apprentissage. Si vous souhaitez les utiliser dans des produits commerciaux, vous devez acheter une licence: http://en.wikipedia.org/wiki/Numerical_Recipes

La plupart du temps, les performances ne seront pas le problème, mais trouver les bons algorithmes et paramètres pour eux, il est donc important d'avoir un langage de script rapide au lieu d'un programme monstre qui doit d'abord compiler 10 minutes avant de calculer deux nombres et de mettre le résultat.

Et un grand avantage de l'utilisation de R est qu'il a des fonctions ou des bibliothèques intégrées pour presque tout type de diagramme dont vous pourriez avoir besoin pour visualiser vos données.

Si vous disposez alors d'une version fonctionnelle, il est presque facile de la porter dans n'importe quelle autre langue que vous jugez plus performante.

Armin
la source