Matlab vs. Julia vs. Python

J'utilise MATLAB depuis plus de 25 ans. (Et avant même d'avoir utilisé MATRIXx , il ne pouvait pas se reposer en paix.) Ce n'est pas la première langue dans laquelle j'ai appris à programmer , mais c'est la langue avec laquelle j'ai atteint l'âge mathématique. Connaître MATLAB a été enrichissant pour ma carrière.

Cependant, il est impossible d'ignorer la croissance de Python dans le calcul scientifique. MathWorks devrait ressentir la même chose: ils ont non seulement ajouté la possibilité d' appeler Python directement depuis MATLAB , mais ont également emprunté certaines de ses fonctionnalités de langage, comme une passe plus agressive pour les composants d'opérateurs binaires.

Le moment est venu où j'ai remis en question mon utilisation continue de MATLAB dans la recherche et l'enseignement. Néanmoins, j'ai tellement investi dans le matériel qu'il était difficile de trouver la motivation pour apprendre quelque chose de nouveau.

Logiciel EDISON - développement web
Cet article a été traduit avec le soutien du logiciel EDISON, qui s'occupe de la santé des programmeurs et de leur petit - déjeuner , et développe également des logiciels personnalisés .

Tutoriel d' introduction MATLAB, que j'ai co-écrit pour les mathématiques computationnelles. Le livre contient plus de 40 fonctions et 160 exemples de calcul, et il couvre ce qui, je pense, est fondamental dans l'utilisation de MATLAB pour les calculs scientifiques numériques. En partie pour l'auto-amélioration et en partie pour augmenter l'utilité du livre cette année, j'ai décidé de traduire le code en Julia et Python . Cette expérience m'a amené à des vues spéciales en trois langues en ce qui concerne le calcul scientifique, que j'essaie de décrire ci-dessous.

Je vais reporter les questions de coût et d'ouverture. MATLAB, contrairement à Python et Julia, n'est pas un produit gratuit. C'est une énorme différence - pour certains, mais je veux considérer les mérites techniques. Pendant de nombreuses années, MATLAB est allé bien au-delà de tout produit gratuit de plusieurs manières très utiles, et si vous voulez être productif, le coût sera infernal. Il s'agit d'une discussion distincte de l'attrait platonique du langage et de l'écosystème.

Si nous omettons les problèmes liés aux coûts, la raison des nombreuses différences dans ces langues est liée à leur origine. MATLAB a d'abord accordé la priorité à l'aspect mathématique, à savoir les mathématiques computationnelles. Python, apparu dans les années 80, a mis l'informatique au premier plan. Créée en 2009, Julia s'est fixé pour objectif de parvenir à un équilibre entre les deux langues précédentes.

MATLAB


Initialement, chaque valeur dans MATLAB était un tableau de nombres à virgule flottante double précision. Les deux aspects de ce choix, les tableaux et les nombres à virgule flottante, ont été inspirés par les décisions de conception.

La norme IEEE 754 pour les nombres à virgule flottante n'a été adoptée qu'en 1985 et la mémoire a été mesurée en kilo-octets et non en gigaoctets. Les nombres à double virgule flottante n'étaient pas le moyen le plus efficace d'afficher des caractères ou des entiers, mais c'était ce que les scientifiques, les ingénieurs et tous les mathématiciens voulaient utiliser la plupart du temps. De plus, les variables ne doivent pas être déclarées et la mémoire ne doit pas être allouée. En laissant votre ordinateur gérer ces tâches et en vous débarrassant des types de données, vous avez libéré votre cerveau pour réfléchir à des algorithmes qui fonctionneraient avec les données.

Les tableaux sont importants car les algorithmes numériques en algèbre linéaire ont pris leurs propres formes LINPACK et EISPACK . Mais y accéder avec un support standard en calcul scientifique, FORTRAN 77, était un processus en plusieurs étapes qui impliquait la déclaration de variables, l'invocation de noms cachés de routines, la compilation de code, puis l'analyse de données et de fichiers de sortie. L'enregistrement de la multiplication matricielle sous la forme A * B et l'énumération de la réponse ont immédiatement entraîné un changement au cours du jeu.

MATLAB a également rendu les graphiques simples et ouverts. Aucune bibliothèque complexe dépendante de la machine avec des appels de bas niveau, il suffit de tracer (x, y), et vous avez vu ce que quelqu'un d'autre aurait vu avec MATLAB. Il y avait encore plus d'innovations, telles que des nombres complexes complexes, des matrices clairsemées, des outils pour créer des interfaces utilisateur graphiques multiplateformes et un ensemble avancé de solveurs ODE qui ont fait de MATLAB un lieu de calcul scientifique à la vitesse de la pensée.

Cependant, une conception idéale pour l'informatique interactive, même longue, n'a pas toujours contribué à l'écriture de programmes bons et productifs. Pour déplacer des données entre de nombreuses fonctions, il fallait manipuler diverses variables et accéder fréquemment à la documentation des arguments d'entrée et de sortie. Une fonction par fichier sur disque dans un espace de noms plat était très simple pour un petit projet, mais un casse-tête pour un grand. Certains modèles de programmation (vectorisation, pré-allocation de mémoire) auraient dû être appliqués si vous voulez éviter les problèmes de vitesse de calcul. Le calcul scientifique est actuellement appliqué à un nombre beaucoup plus grand de domaines avec un grand nombre de types de données différents. Etc.

En réponse, MathWorks a continué d'innover chez MATLAB: fonctions intégrées, fonctions imbriquées, variables de fin, nombreux types de données, fonctions orientées objet, infrastructures de tests unitaires, etc. Chaque innovation était probablement une solution à un problème important. Mais l'accumulation de 40 ans de ces changements a eu pour effet secondaire de brouiller la simplicité et l'unité du concept. En 2009, j'ai écrit un livre qui couvrait assez bien les bases de MATLAB sur moins de 100 pages. Pour autant que je sache, toutes ces choses sont toujours disponibles. Mais vous devez en savoir beaucoup plus maintenant pour vous appeler un professionnel.

Python


L'histoire de Python est en partie une image miroir de l'histoire de MATLAB. Il y avait une ligne de commande interactive dans les deux langues (maintenant elle est appelée REPL est une abréviation de boucle d'impression read-eval, qui se traduit par une boucle lecture-évaluation-impression, ainsi que la liberté de diverses déclarations et compilations. Cependant, MatLab a été créé principalement avec un œil sur l'informatique analyse, tandis que python a été créé pour les pirates. Ensuite, chacune des langues a pu étendre sa base d'utilisateurs en mettant à jour et en étendant les fonctionnalités.

À mon avis, Python souffre toujours de la pauvreté de son appareil mathématique. Il contient des petites choses inconfortables comme la présence de ** au lieu de ^, @ est utilisé pour multiplier les matrices (il a été récemment ajouté!), Pas la taille, mais la forme de la matrice, le stockage orienté ligne, etc. Si vous pensez que V.conj (). T @ D ** 3 @ V est plus élégant que V ∗ D 3 V, alors vous n'êtes probablement pas d'accord avec votre tête. De plus, l'indexation commence à 0 (au lieu de 1). J'ai eu l'occasion de prendre connaissance de l' opinion opposée , cependant, à mon avis, ce n'est pas si convaincant, évidemment, tout cela est une question de préférence personnelle, un sujet de guerres saintes sur Internet, car vous pouvez toujours donner un exemple lourd à votre avantage, qu'est-ce que c'est exactement pour moi cela semble convaincant, car depuis des décennies nous avons toujours commencé l'indexation mathématique des vecteurs et des matrices avec 1, et de nombreux pseudo-codes sont basés sur cette hypothèse.

En plus de certains inconvénients, je trouve le système Python + NumPy + SciPy lourd et incohérent, un bon exemple est le fait que malgré la forte concentration sur l'objet, des classes de matrice existent là-bas, et leur utilisation n'est pas recommandée , Peut-être que MatLab m'a gâté comme ça, mais je considère que les matrices sont un objet important qui doit être gardé à portée de main et utilisé activement. La possibilité d'utiliser * pour effectuer diverses opérations avec des tableaux et des matrices n'est-elle pas la principale caractéristique de la POO? En général, il y a de nombreux moments malheureux à cet égard, (pourquoi ai-je besoin de la commande spsolve ? Pourquoi ne puis-je pas simplement appliquer la commande résoudre à une matrice clairsemée? Et il y en a encore beaucoup.)

Il y a aussi des endroits où l'écosystème numérique semble un peu pire. Par exemple, les solveurs carrés et ODE ont l' air minimalistes en 2019. pour autant que je sache, il n’existe aucune méthode pour les solveurs DAE, DDE, symplectiques ou implicites qui permette les itérations internes de Krylov. Regardez, ces fonctions sont généralement de 30 ans ou plus - elles sont toujours bonnes, mais très loin d'être parfaites. Matplotlib est un package incroyable avec lequel travailler, et dans certains cas, il avait l'air mieux que MATLAB, mais la 3D me manque.

Certains experts soutiennent qu'il existe des raisons pour lesquelles le code Python essaie de lutter contre la vitesse avec les langages compilés. Je suis surpris du résultat de recherche " python is too slow ." Les champions de Python citent de nombreux arguments / excuses que les gens ont faits à l'époque pour MATLAB. Cela ne signifie pas qu'ils se trompent, mais c'est plus qu'un simple problème de perception .

Je comprends pourquoi Python était si excitant pour beaucoup de gens en informatique scientifique. Il a une certaine syntaxe et la puissance de MATLAB, disponible auprès de REPL. Il dispose d'excellents outils et fonctionne bien avec d'autres langages et domaines de calcul. Il l'a offert gratuitement et avec une bien meilleure reproductibilité à long terme. De toute évidence, cela fonctionne bien pour de nombreuses personnes qui ne voient probablement que peu de raisons de changer.

En raison de ce que je sais faire en informatique scientifique, Python m'oblige à faire plus de travail de routine sur l'apprentissage et l'utilisation que je n'en ai l'habitude. Pendant un certain temps, nous ne saurons pas s'il se poursuivra dans la communauté ou s'il est déjà proche de son apogée.

Julia


Julia a ses avantages et ses inconvénients car il est en retard. J'admire les créateurs de Julia pour avoir compris qu'ils pouvaient faire plus

Nous voulons un langage open source avec une licence de bibliothèque. Nous voulons une vitesse C avec une dynamique Ruby. Nous voulons que le langage soit homoionique, avec de vraies macros comme Lisp, mais avec des notations mathématiques évidentes et familières comme dans Matlab. Nous voulons quelque chose d'aussi programmable que Python, aussi simple que des statistiques pour R, aussi naturel que le traitement de chaînes comme Perl, aussi puissant que l'algèbre linéaire comme Matlab, et capable de coller des programmes ensemble comme un shell . Quelque chose de facile à apprendre, mais qui plait en même temps aux hackers les plus sérieux. Nous voulons qu'il soit interactif et nous voulons qu'il soit compilé.

Je pense que dans une large mesure, ils ont réussi. À la sortie de la version 1.0, ils semblaient légèrement différents de REPL et de MATLAB. (Quelle est la précision de LinRange mieux que linspace?) Bien que ce soit taquin.

C'est le premier langage que j'ai utilisé, avec la possibilité d'aller au-delà de l'ASCII. Je tire une satisfaction excessive de l'utilisation de variables telles que Phi et d'opérateurs tels que ≈. C'est plus qu'une belle enveloppe; pouvoir ressembler davantage aux expressions mathématiques que nous écrivons est un vrai plus, même si cela complique un peu l'apprentissage et la documentation.

Les emplois chez Julia m'ont montré que j'avais acquis certaines compétences en programmation en raison du choix de MATLAB, et non en raison de sa supériorité intrinsèque. La vectorisation n'est pas naturelle pour beaucoup de choses. Julia révèle que vous pouvez vectoriser n'importe quelle fonction en ajoutant simplement un point à son nom. La construction d'une matrice à l'aide de la compréhension fait que les boucles imbriquées (ou astuces avec une grille d'une grille) ressemblent à des fouets erronés en comparaison, et contourner la matrice dans son ensemble avec un générateur pour une sommation simple, c'est comme obtenir quelque chose pour rien. (Je sais que Python a des fonctionnalités de langage similaires.)

La grande caractéristique de la répartition multiple rend certaines choses beaucoup plus faciles et plus compréhensibles que l'orientation de l'objet. Par exemple, supposons que vous ayez les classes Mur et Boule dans un langage traditionnel orienté objet. Quelle classe devrait détecter la collision d'une balle avec un mur? Ou avez-vous besoin d'un cours en salle pour jouer l'arbitre? Des questions comme celle-ci peuvent me distraire. Avec la planification multiple, les données sont regroupées en types d'objet, mais les méthodes qui fonctionnent avec les données ne sont pas liées à une classe. Alors
fonction detect_collision (B :: Ball, W :: Wall)
connaît les types, mais est déterminé indépendamment d'eux. Il m'a fallu beaucoup de programmation pour comprendre à quel point le concept de répartition multiple était intéressant et potentiellement important pour étendre la langue.

L'écosystème numérique se développe rapidement. Mon exemple numéro un est DifrentialEquations.jl , écrit par le merveilleux Chris Rakautskas . Si ce logiciel ne remporte pas de sitôt le prix Wilkinson, le système est en panne. Rendez-vous simplement sur le site et préparez-vous à faire appel.

Je n'ai pas encore vu les grands gains de vitesse sur MATLAB que Julia promet. C'est en partie mon inexpérience relative et les types de tâches que j'effectue, mais en partie parce que MathWorks a fait un travail incroyable d'optimisation automatique du code. En tout cas, ce n'est pas l'aspect du codage sur lequel je me concentre la plupart du temps.

La programmation dans Julia m'a pris du temps pour me sentir à l'aise (peut-être que je vieillis et que je me cristallise). Cela me fait penser aux types de données plus que je ne le souhaiterais, et il y a toujours un soupçon que j'ai raté la bonne façon de faire quelque chose. Mais pour un usage quotidien, je me tournerai très probablement vers Julia en tant que MATLAB.

Résumé


MATLAB est une solution d'entreprise, principalement utilisée pour résoudre des problèmes d'ingénierie. Il reste l'outil le plus simple pour résoudre des problèmes numériques. Une documentation très importante et un développement sur dix ans de l'entreprise y jouent sans aucun doute un rôle important.

MATLAB est comme une berline BMW du monde de l'informatique scientifique. C'est cher, même avant de parler d'accessoires. (Kit d'outils). Vous payez pour un fonctionnement et un service sans faille et ininterrompus. Mais elle attire également une quantité disproportionnée de haine .

Python est une camionnette Ford. Il est omniprésent et apprécié par beaucoup (aux États-Unis). Il peut faire tout ce que vous voulez et il est conçu pour faire ce que les autres voitures ne peuvent pas faire. Très probablement, vous le voudrez de temps en temps. Mais cela ne vous donne pas beaucoup d'expérience de conduite.

Julia est Tesla. Il est construit dans le but audacieux de changer l'avenir, et c'est possible. Mais cela peut aussi être juste une mention. En même temps, vous obtiendrez où vous êtes sur le style et avec une grande réserve de force.


Lisez aussi le blog
Société EDISON:


20 bibliothèques pour
application iOS spectaculaire

Source: https://habr.com/ru/post/fr480716/


All Articles