De nombreux algorithmes numériques (intégration, différenciation, interpolation, fonctions spéciales, etc.) sont disponibles dans des bibliothèques de calcul scientifiques telles que GSL . Mais je vois souvent du code avec des implémentations "roulées à la main" de ces fonctions. Pour les petits programmes qui ne sont pas nécessairement destinés à une distribution publique, est-ce une pratique courante parmi les scientifiques en informatique de simplement mettre en œuvre vous-même des algorithmes numériques (par exemple, copier ou transcrire à partir d'un site Web, de Recettes numériques, ou d'un logiciel similaire) lorsque vous en avez besoin? Si tel est le cas, existe-t-il une raison particulière d' éviter de créer un lien avec GSL ou s'agit-il simplement d'une "tradition"?
Je le demande parce que je suis un grand partisan de la réutilisation du code , ce qui me suggèrerait d'essayer d'utiliser les implémentations existantes lorsque cela est possible. Mais je suis curieux de savoir s’il existe des raisons pour lesquelles ce principe a moins de valeur dans le calcul scientifique que dans la programmation générale.
Oubli de mentionner: je parle spécifiquement de C et C ++, par opposition à des langages tels que Python où l’utilisation d’une bibliothèque présente un avantage évident (vitesse d’exécution).
Réponses:
J'avais l'habitude de tout mettre en œuvre moi-même, mais j'ai récemment commencé à utiliser beaucoup plus de bibliothèques. Je pense que l’utilisation d’une bibliothèque présente plusieurs avantages très importants, au-delà de la simple question de savoir si vous devez écrire une routine vous-même ou non. Si vous utilisez une bibliothèque, vous obtenez
Au dernier point ci-dessus, je pense aux grandes bibliothèques comme Trilinos ou PETSc . Je peux renforcer ceci avec quelques exemples personnels concrets dans le développement de PyClaw . Bien qu'il aurait été simple de mettre en parallèle Clawpack et les appels MPI, nous avons choisi d'utiliser PETSc. Cela nous a permis de limiter le code parallèle dans le package à moins de 300 lignes de Python. Mieux encore, en plaçant nos données au format PETSc, nous avons immédiatement accès aux solveurs implicites de PETSc, ce qui permet de travailler actuellement sur un solveur implicite dans PyClaw. Comme second exemple, PyClaw a initialement inclus la reconstruction WENO de cinquième ordre à code manuel, mais nous avons finalement décidé de nous en remettre à PyWENO.forfait pour cela. Cela a été un gain énorme, car PyWENO peut générer automatiquement des routines WENO de n'importe quel ordre dans plusieurs langues.
Enfin, si vous utilisez des bibliothèques, vous pouvez contribuer en développant des améliorations ou en trouvant des bogues, ce qui profitera à de nombreuses autres personnes, alors que le débogage ou l'amélioration de votre propre code ne vous est que bénéfique.
la source
La charge de programmation liée à la liaison avec une fonction de bibliothèque représente une surcharge importante pour le programmeur, en particulier si cette bibliothèque est nouvelle pour le programmeur. Il est souvent plus simple de simplement réécrire des algorithmes simples plutôt que de déterminer les spécificités d'une bibliothèque particulière. Au fur et à mesure que les algorithmes deviennent plus complexes, ce comportement change.
Python a excellé à réduire cette surcharge avec des outils tels que pip / easy_install et une interface de structure de données uniforme (chaque bibliothèque semble prendre et produire un tableau numpy).
la source
L’un des projets auxquels je participe actuellement est la rédaction d’un logiciel de simulation et d’analyse flexible pour une classe de détecteurs de la physique des particules. L'un des objectifs de ce projet est de fournir la base de code à utiliser dans ces domaines pour les décennies à venir.
À ce stade, nous avons déjà deux douzaines de dépendances, ce qui fait du processus de construction un tel cauchemar qu'il a créé un projet distinct géré par le centre de calcul Fermilab uniquement pour fournir une chaîne d'outils fiable.
Maintenant, imaginez que vous rencontriez un besoin pour un outil qui ne fait pas partie de cette chaîne d’outils (m’est arrivé le mois dernier). Vous avez trois choix
C'est très facile de choisir (1). Peut-être trop facile.
la source
Je pense qu'il est assez fréquent, avec des algorithmes plus susceptibles d'être réimplémenté que d' autres.
Il y a un compromis délicat à trouver entre l'installation gênante d'une bibliothèque, la difficulté d'implémentation de l'algorithme vous-même, sa difficulté à l'optimiser et le degré d'adaptation de la bibliothèque à vos besoins. De plus, utiliser une bibliothèque est parfois exagéré: j'ai utilisé l'algorithme de bissection lente dans l'un de mes programmes car je ne l'ai appelé que quelques fois et je ne voulais pas ajouter de bibliothèque uniquement pour cela.
Est-il facile pour vous d'écrire une version bien optimisée? Si c'est le cas, vous feriez mieux de le faire. Vous obtiendrez exactement ce dont vous avez besoin et vous ne dépendez du travail de personne. Mais bien sûr, vous devez vraiment savoir ce que vous faites: même des algorithmes simples peuvent être difficiles à implémenter.
Je serais curieux de voir une étude à ce sujet, mais de mon point de vue biaisé, les scientifiques utilisent souvent des bibliothèques pour l’algèbre linéaire et les générateurs de nombres aléatoires, la plupart du code restant étant fait maison.
la source
Je pense que la mise en œuvre d'un algorithme au lieu d'utiliser une bibliothèque peut parfois donner une meilleure compréhension et un meilleur contrôle du modèle. Lorsque je code un programme pour des calculs scientifiques, il est important que je comprenne ce que je fais. L'implémentation des algorithmes importants m'aide à mieux connaître le problème et à mieux le contrôler.
D’autre part, il n’est parfois pas facile de sélectionner une bibliothèque nécessaire à l’obtention d’une solution. Il est donc préférable de rechercher des algorithmes déjà implémentés lorsque vous êtes certain de ce que vous essayez d’atteindre et pourquoi vous le souhaitez.
Si les algorithmes sont complexes, leur codage à la main vous permet d’améliorer les performances / la qualité de la solution à l’aide de fonctionnalités spécifiques à une tâche. Et parfois, il est nécessaire de modifier légèrement l’algorithme, ce qui est plus facile si vous connaissez le code que vous avez écrit et que vous pouvez le modifier comme vous le souhaitez.
la source
Une réponse est qu'il existe tellement de légères variations dans le code numérique qu'il est vraiment difficile de l'intégrer dans une bibliothèque. Comparez cela au logiciel Web, qui est souvent facile à installer et dispose d’un ensemble clair d’entrées et de sorties. Je pense qu'il est plus courant que des personnes s'emparent d'un framework ou d'une grande bibliothèque agissant comme un framework (Trilinos / PETSc) et utilisent cet écosystème pour tirer parti des codes de communauté.
la source
Avant de décider d'utiliser ou non des bibliothèques, je pense que vous voudriez également savoir à quel point l'utilisation d'une bibliothèque aidera votre code. Si vous allez utiliser une bibliothèque bien optimisée pour un noyau de calcul clé, alors c'est probablement beaucoup plus efficace que d'essayer d'écrire votre propre noyau.
Cependant, si vous écrivez une routine spécialisée qui ne sera appelée qu'une fois pendant l'exécution d'un programme, il ne vaut peut-être pas la peine d'adapter votre code pour l'adapter au cadre requis par une bibliothèque.
(Une autre chose à considérer: combien de réarchitecture devrez-vous faire pour tirer parti de la bibliothèque? À moins que les heures de travail que vous passez à corriger le code ne soient compensées par des gains correspondants d'efficacité ou de précision numérique, il est possible que Cependant, idéalement, c’est ce que vous envisagez de faire lors de la conception initiale de structures de données et d’algorithmes, de sorte que le "flux" de la bibliothèque soit pris en compte à partir de la base.)
la source
Mes 2 centimes
Je pense qu'il est plus facile d'écrire de manière générale à ce sujet, plutôt que de parler de C / C ++. Premièrement, les bibliothèques dans des langages tels que Python ne sont pas nécessairement utilisées pour obtenir un avantage en termes de vitesse, même si cela est une conséquence. Je pense que @David a assez bien expliqué les raisons.
En partant du haut, l'implémentation du langage dicte dans une certaine mesure les bibliothèques auxquelles vous avez accès. Les langages couramment utilisés en informatique comprennent C, C ++, Python, Perl, Java, Fortran et R. Des exemples moins courants pourraient être Ocaml et Common Lisp. Maintenant, puisque la plupart de ces langages sont écrits en C, ils ont une interface de fonction étrangère naturelle avec C. Cependant, il n’est pas si facile d’appeler, par exemple, une bibliothèque Perl de Python ou inversement. Donc, dans la pratique, les gens ont tendance à
Utiliser une bibliothèque écrite dans leur langage d'implémentation, généralement quelque chose qui fait partie des bibliothèques standard, ou qui est par ailleurs largement disponible, ou
Appelez une bibliothèque C / C ++ via les langages FFI. Cela suppose qu’une enveloppe n’existe pas déjà, car si elle existe, elle ne se distingue pas facilement de (1).
(2) est généralement plus difficile, car vous devez envelopper vous-même la fonction C / C ++. En outre, vous devez regrouper la bibliothèque ou ajouter une dépendance supplémentaire. Pour cette raison, les gens sont plus susceptibles d’utiliser les bibliothèques de langues intégrées plutôt que GSL par exemple, qui est en C.
Pour les routines très génériques, par exemple pour générer des échantillons aléatoires à partir de distributions, ou des routines numériques de base telles que la quadrature des intégrales, il est facile et courant de réutiliser une bibliothèque. À mesure que la fonctionnalité que l'on essaie d'implémenter devient plus complexe, il devient de plus en plus improbable que l'on trouve la fonction exacte souhaitée dans une autre bibliothèque, et même celle-ci, on pourrait passer beaucoup de temps à chercher et à adapter la fonction nécessaire (le style / la conception du code pourrait par exemple poser problème). Et comme discuté ci-dessus, on n'a accès qu'à un sous-ensemble des bibliothèques existantes. D'autre part, implémenter soi-même un algorithme s'il est complexe et non l'objectif principal peut être décourageant, et bien sûr, il faut gérer ces problèmes de vitesse embêtants.
Cela devient donc un problème d'optimisation dans l'analyse coûts / avantages. Mon expérience est que même pour des techniques relativement standard comme MCMC, je finis généralement par écrire mon propre code, car cela correspond mieux à la façon dont je conçois le logiciel dans son ensemble.
Bien sûr, même si vous n'utilisez pas le code, il est possible d'apprendre du code des autres. Cependant, je ne sais pas à quelle fréquence les scientifiques se donnent la peine de le faire. Mon impression est que lire le code des autres pour apprendre est davantage une affaire d'ingénieur en logiciel.
la source
En repensant à mon cours de mécanique de deuxième année, je me rends compte qu'une partie de la raison pour laquelle j'ai implémenté mes propres versions d'algorithmes bien connus est que j'ai appris à le faire de cette façon. Je ne peux pas penser à un seul exemple où on m'a appris à établir une interface avec une bibliothèque dans ma formation de physique de premier cycle. Je me souviens très bien d'avoir vu pour la première fois une liste des coordonnées d'une balle de golf en rotation, après avoir calculé moi-même la solution des équations de Newton couplées. Il y a un certain frisson et une certaine satisfaction (voire une fierté) à calculer les choses à partir de zéro.
la source
Je pense qu'on devrait utiliser autant que possible des bibliothèques testées. La plupart des gens ne sont pas des experts en informatique numérique et ne seront probablement pas en mesure de mettre en œuvre une solution aussi correctement et avec autant de soin que ce qui est disponible dans des bibliothèques bien testées. Cela dit, il arrive parfois qu’aucune bibliothèque disponible ne mette en oeuvre la combinaison de fonctionnalités requise dans une application donnée. J'ai vu cela se produire dans le domaine technique dans lequel je travaille; Les codes existants ne résolvaient pas tous les cas et quelqu'un finissait par implémenter un solveur à partir de rien.
la source
Le problème fondamental est souvent lié à l'interface entre l'application et la bibliothèque. Un programmeur d'application a connaissance du problème qui est souvent perdu lors de la transmission du problème (par exemple sous forme de matrice) à une bibliothèque. Cette connaissance est telle que son exploitation dépasse largement les avantages de l’utilisation de la bibliothèque hautement optimisée. En conséquence, le programmeur d'application "lance" sa propre implémentation qui exploite les connaissances.
Ainsi, une très bonne bibliothèque a besoin que de telles connaissances soient transmises de l'application à la bibliothèque, de sorte que la bibliothèque aussi puisse en tirer parti.
la source
En plus de tout ce qui a déjà été dit ci-dessus, je vais répéter ma réponse à la question "Fortran vs C ++": L'atout le plus précieux d'un programmeur est son temps. Oui, les dépendances externes sont souvent gênantes. Mais passer du temps à ré-implémenter, déboguer et tester des algorithmes déjà mis en place par les autres algorithmes est presque toujours stupide, et le résultat sera rarement aussi bon que le code écrit par des experts sur un sujet particulier. Réutilisez ce que d'autres ont fait!
la source
Le groupe avec lequel je travaille utilise le plus possible les bibliothèques. Je suis l'un des rares programmeurs, et le reste des gens s'est intéressé à la programmation au travail. Ils en savent assez sur leurs propres limites pour savoir où ils ne devraient pas frotter. IMSL est la bibliothèque préférée. Des choses comme GSL seraient interdites en raison de restrictions de licence, même s'il s'agit d'une agence fédérale et que nous cédons nos logiciels quand même.
la source
"La réutilisation est avant tout un phénomène social. Je peux utiliser le logiciel de quelqu'un d'autre à condition
"- B. Stroustrup, Édition du langage de programmation C ++ 2 (1991) p. 383.
la source
Plusieurs bonnes raisons ont été données par d’autres d’utiliser des bibliothèques et de lancer leurs propres routines.
Vous pouvez parfois accélérer les calculs pour une application spécifique parce que vous savez à l'avance que vous n'aurez jamais besoin de la vaste gamme de valeurs que couvre la routine de bibliothèque ou de la précision fournie par ces routines.
Bien sûr, beaucoup dépend de l'application en question et du nombre de fois où la routine de bibliothèque sera appelée. Pourquoi voudriez-vous appeler une routine de bibliothèque pour les fonctions Bessel des milliards de fois si vous n'avez besoin que de quelques chiffres significatifs pour une petite plage de x et qu'une technique plus simple suffira à vos besoins?
la source
Peu de chose à ajouter, nous devons réutiliser le code, il en va de la durabilité du code et de sa contribution à la société, mais c’est tout.
La raison pour laquelle nous ne réutilisons pas le code est que si vous commencez à programmer, il est difficile de comprendre le code des autres. C'est particulièrement difficile avec le C ++ avancé, et vous pouvez aussi faire quelques astuces en C pur.
Très souvent au début, on comprend la méthode, mais pas telle qu’elle est implémentée dans la bibliothèque, ou simplement comment utiliser la bibliothèque avec son interface générique, son contrôle des erreurs et ses conventions, très souvent documentées pour les programmeurs expérimentés. Cela donne l’illusion qu’il vaut mieux mettre en œuvre une méthode standard, telle que la factorisation de LU par vous-même. De plus, les nouveaux programmeurs sous-estiment la valeur des tests de code, de la validation et de la portabilité pour différents systèmes d'exploitation. Donc, à la fin, la paresse, écrire son propre code apparaît comme une solution plus rapide et plus simple.
La réalité est que nous pouvons apprendre davantage en utilisant et en lisant du code que de programmer par vous-même.
La paresse me conduit la plupart du temps, je pense aussi à la majorité des gens. Pour la même raison, certains écrivent du code à partir de rien et d'autres utilisent des bibliothèques existantes.
la source
Les algorithmes des bibliothèques fournissent par contraste avec leurs propres implémentations:
Je considère toujours bon, lorsqu’on entre dans un nouveau domaine, d’implémenter soi-même une version d’un algorithme bien compréhensible. Je prend beaucoup de temps au total. J'ai acheté et lu des livres, la presse nommée et al. J'ai toujours lu beaucoup de théorie avant et pendant ces implémentations. Et après avoir compris les concepts généraux d'un domaine et avoir expérimenté les pièges dans la pratique, il est temps de passer rapidement à la meilleure implémentation de bibliothèque. Je pense que vous deviendrez un meilleur utilisateur de la bibliothèque si vous écriviez vous-même un algorithme "hello world" dans le champ des bibliothèques.
Si vous travaillez dans une équipe plus grande, le choix de votre équipe d'utiliser une bibliothèque spécifique peut ne pas être votre propre choix. L'équipe principale pourrait prendre la décision. Et il pourrait y avoir une personne responsable de la liaison de la bibliothèque dans votre projet avec ses propres plannings horaires. Réécrire un algorithme que vous pouvez faire avec votre propre planification, sans vous fier à la décision des autres.
Si vous êtes seul et aimez distribuer, il y a un autre problème. Je considère, ainsi que de nombreux autres codes sources, la ressource la plus utile. Beaucoup d’informaticiens pourraient être d’accord ici. Dans un domaine appliqué en dehors de l'informatique, il peut être nécessaire de fournir un exécutable précompilé sur Windows. Sous Linux, vous pouvez configurer les choses relativement facilement par vous-même dans le cas de bibliothèques d'utilisation open source.
Réécrire vous-même un algorithme donne la liberté de lecture. Votre projet pourrait ne pas prendre en charge la licence GPL de GSL par exemple.
La lecture pourrait être la seule contrainte indépendante du point de vue des chercheurs.
la source