web-dev-qa-db-fra.com

MATLAB est-il plus rapide que Python?

Je souhaite calculer les champs magnétiques de certains conducteurs en utilisant la loi Biot – Savart et utiliser une matrice 1000x1000x1000. Avant d’utiliser MATLAB, je souhaite maintenant utiliser Python. Python est-il plus lent que MATLAB? Comment puis-je rendre Python plus rapide? 

EDIT: Le meilleur moyen peut-être de calculer le grand tableau avec C/C++, puis de les transférer en Python. Je veux visualiser alors avec VPython

EDIT2: Quel est le meilleur dans mon cas: C ou C++? 

35
kame

Vous trouverez peut-être des résultats utiles au bas de ce lien.

http://wiki.scipy.org/PerformancePython

Dès l'introduction,

Une comparaison du tissage avec NumPy, Pyrex, Psyco, Fortran (77 et 90) et C++ pour résoudre l'équation de Laplace.

Il compare également MATLAB et semble afficher des vitesses similaires à celles obtenues avec Python et NumPy .

Bien entendu, il ne s'agit que d'un exemple spécifique, votre application peut autoriser des performances meilleures ou moins bonnes. Il n'y a aucun mal à exécuter le même test sur les deux et à comparer.

Vous pouvez également compiler NumPy avec des bibliothèques optimisées telles que ATLAS qui fournit des routines BLAS / LAPACK . Ceux-ci devraient être d'une vitesse comparable à MATLAB. 

Je ne sais pas si les téléchargements NumPy sont déjà conçus, mais je pense qu'ATLAS ajustera les bibliothèques sur votre système si vous compilez NumPy,

http://www.scipy.org/Installing_SciPy/Windows

Le lien contient plus de détails sur ce qui est requis sous la plate-forme Windows.

MODIFIER:

Si vous voulez savoir ce qui fonctionne le mieux, le C ou le C++, il pourrait être intéressant de poser une nouvelle question. Bien que le lien ci-dessus C++ a de meilleures performances. D'autres solutions sont également très proches, à savoir Pyrex, Python/Fortran (en utilisant f2py) et C++ en ligne.

La seule algèbre matricielle sous C++ que j'ai jamais faite utilisait MTL et implémentait un filtre de Kalman étendu. Je suppose cependant que cela dépend essentiellement des bibliothèques que vous utilisez avec LAPACK/BLAS et de la qualité de son optimisation. 

Ce lien contient une liste de packages numériques orientés objet pour de nombreuses langues.

http://www.oonumerics.org/oon/

27
petantik

NumPy et MATLAB utilisent tous deux une implémentation sous-jacente de BLAS pour les opérations d'algèbre linéaire standard. Pendant quelque temps, les deux utilisaient ATLAS , mais de nos jours, MATLAB est apparemment livré avec d'autres implémentations telles que Math Kernel Library (MKL) d'Intel. Le choix le plus rapide dépend du système et de la manière dont l’implémentation de BLAS a été compilée. Vous pouvez également compiler NumPy avec MKL et Enthought travaille sur le support MKL pour leur distribution Python (voir leur roadmap ). Voici également un récent article de blog intéressant à ce sujet.

D'autre part, si vous avez besoin d'opérations plus spécialisées ou de structures de données, Python et MATLAB vous proposent différents moyens d'optimisation (comme Cython , PyCUDA , ...).

Edit: J'ai corrigé cette réponse pour prendre en compte différentes implémentations de BLAS. J'espère que c'est maintenant une représentation juste de la situation actuelle.

19
nikow

Le seul test valable est de le comparer. Cela dépend vraiment de la nature de votre plate-forme et du degré de correspondance de la loi Biot-Savart avec les opérations intégrées Matlab ou NumPy/SciPy.

Pour accélérer Python, Google travaille sur Unladen Swallow, un compilateur JIT pour Python. Il y a probablement d'autres projets comme celui-ci également.

7
Mike DeSimone

Conformément à votre modification 2, je vous recommande fortement d'utiliser Fortran, car vous pouvez exploiter les sous-routines d'algèbre linéaire disponibles (Lapack et Blas) et il est beaucoup plus simple que C/C++ pour les calculs matriciels.

Si vous préférez utiliser une approche C/C++, j'utiliserais C, car vous avez probablement besoin de performances brutes sur une interface supposément simple (les calculs de matrice ont tendance à avoir des interfaces simples et des algorithmes complexes).

Si, toutefois, vous décidez d'utiliser C++, vous pouvez utiliser TNT (Template Numerical Toolkit, l'implémentation C++ de Lapack).

Bonne chance.

4
Escualo

Si vous utilisez uniquement Python (avec NumPy), cela peut être plus lent, selon les éléments que vous utilisez, que vous ayez optimisé ou non les bibliothèques d'algèbre linéaire installées et dans quelle mesure vous savez tirer parti de NumPy. 

Pour accélérer les choses, vous pouvez faire certaines choses. Il existe un outil appelé Cython qui vous permet d’ajouter des déclarations de type au code Python et de le traduire en module d’extension Python en C. L’avantage que cela vous procure dépend un peu de votre diligence avec vos déclarations de type - si vous n'en ajoutez pas du tout, vous ne verrez aucun avantage. Cython prend également en charge les types NumPy, bien que ceux-ci soient un peu plus compliqués que les autres types.

Si vous avez une bonne carte graphique et que vous souhaitez en apprendre un peu plus sur l'informatique GPU, PyCUDA peut également vous aider. (Si vous n’avez pas de carte graphique nvidia, j’entends dire qu’il existe également un PyOpenCL). Je ne connais pas votre domaine de problèmes, mais s'il peut être associé à un problème CUDA, il devrait pouvoir gérer vos 10 ^ 9 éléments correctement.

3
kwatford

Et voici une "comparaison" mise à jour entre MATLAB et NumPy / MKL basée sur des fonctions d’algèbre linéaire:

http://dpinte.wordpress.com/2010/03/16/numpymkl-vs-matlab-performance/

Le produit scalaire n'est pas si lent ;-)

2
user294958

Je tiens également à souligner que Python (+ NumPy) peut facilement s’interfacer avec Fortran via le module F2Py, qui vous permet en principe d’accéder aux vitesses natives de Fortran sur les éléments de code que vous y transférez.

0
Connor Glosser

Je ne pouvais pas trouver beaucoup de chiffres difficiles pour répondre à la même question, alors je suis allé de l'avant et j'ai fait les tests moi-même. Les résultats, les scripts et les ensembles de données utilisés sont tous disponibles ici dans mon post sur Vitesse de MATLAB vs Python pour l’analyse de vibration .

En bref, la fonction FFT de MATLAB est meilleure que celle de Python, mais vous pouvez effectuer quelques manipulations simples pour obtenir des résultats et une vitesse comparables. J'ai également constaté que l'importation de données était plus rapide en Python par rapport à MATLAB (même pour les fichiers MAT utilisant scipy.io).

0
Steve