7
votes

PERSONNE NUMPY.CLOSS () Performance

Je fais des tests de performance afin d'améliorer la performance d'un projet d'animal de compagnie que j'écris. C'est une application intensive très chiffrée-crunching, alors j'ai joué avec un moyen d'améliorer la performance de calcul.

Cependant, le résultat des tests de performance suivants était assez surprenant ...

code source de test (mis à jour avec des cas de test pour la soumission de levage et par lot) xxx

résultats d'origine < / strong> xxx

résultats finaux xxx

Inutile de dire que ce n'était pas le résultat que j'attendais. La version python python fonctionne presque 30 fois plus rapidement que NUMPY. Les performances numpées dans d'autres tests ont été meilleures que l'équivalent Python (qui était le résultat attendu).

Donc, j'ai deux questions connexes:

  • Quelqu'un peut-il expliquer pourquoi NUMPY fonctionne si mal dans ce cas?
  • Y a-t-il quelque chose que je peux faire pour le réparer?

0 commentaires

4 Réponses :


6
votes

Essayez-le avec des tableaux plus grands. Je pense que juste le coût d'appel des méthodes de numpy ici dépasse les accès simples de la liste de la liste requise par la version Python. Si vous traitez avec des tableaux plus importants, je pense que vous verrez de grandes victoires pour numpy .


3 commentaires

Dans ce cas particulier, 3 matrices de composants (x, y, z coordonnées) sont de loin les cas les plus courants. Ce qui est aussi un peu bizarre est que même la lecture de tableaux numpopiques, le code Python est toujours plus rapide. S'il s'agissait d'appel au-dessus de l'appel, je m'attendrais à ce que cela puisse ralentir encore plus que la solution pure engourdie.


@Adam: Mais en lisant des tableaux de Numpy, vous enregistrez les frais généraux d'appeler la fonction , qui est une extension chargée de manière dynamique afin qu'elle passe au moins deux pointeurs. Pour de tels matrices courtes, il est en effet logique comme une micro-optimisation pour dérouler l'appel à cross


Je viens d'ajouter un cas d'essai où je lâche les tableaux ensemble et j'ai vu une performance considérable. Donc, je dirais que la théorie des frais généraux est correcte. On dirait que si je veux utiliser des numéros pour un boost de performance, je devrai trouver un moyen de combiner ces opérations ensemble.



5
votes

Vous pouvez voir le code source vous-même ici: http://www.google.com/codeSearch/p?hl=fr#5maq98L-Muw/trunk/dnumpy/numpy/core/numérique .py & q = croix% 20package: Numpy & SA = N & CD = 1 & CT = RC

Numpy.Cross gère beaucoup de cas et fait quelques copies supplémentaires.

En général, NUMPY va être suffisamment rapide pour des choses lentes telles que la multiplication de matrice ou l'inversion - mais les opérations sur de petits vecteurs comme celle-ci ont beaucoup de frais généraux.


0 commentaires

1
votes

Pour réduire la surcharge d'appel numpy, vous pouvez essayer d'utiliser Cyron comme un intermédiaire pour appeler les fonctions numpues.

voir calculs numériques rapides avec Cyron (Scipy 2009) pour plus de détails. < / p>


0 commentaires

0
votes

Excellent post! Je pense que la comparaison n'est pas réellement juste. Le produit de la croix de lots donne une matrice contenant les produits croisés de tous les vecteurs tandis que Python Cross Product donne un vecteur à la fois. Si vous devez calculer tous les produits croisés à la fois du lot de cours, c'est mieux, mais si vous devez calculer chaque produit croisé séparément, vous devez inclure la surcharge d'accès à la matrice. En outre, si un produit croisé si une fonction du produit croisé précédent, la mise en œuvre par lots doit être modifiée.


0 commentaires