Categories
Programming Python

Comparaison des performances de Python 2.7 et 3.3 avec Ackermann

$ time python ackermann.py 3 12
32765
 
real    2m33.121s
user    2m32.518s
sys     0m0.088s

$ time python ackermann.py 3 12
32765

real    2m57.908s
user    2m57.316s
sys     0m0.068s

$ time python3.3 ackermann.py 3 12
32765

real    4m6.365s
user    3m18.204s
sys     0m47.452s

Tests effectués avec, dans l’ordre, Python 2.7.3, 2.7.4 et 3.3.1 sur cet algorithme. Nous voyons que malgré le fait que Python 3.* s’améliore (voir ce billet), Python 2.7 est toujours bien plus rapide. Ce test n’utilise pas d’itérateurs ou objets/structures complexes. Il s’agit simplement de l’implémentation naïve de la fonction d’Ackermann. Nous avions déjà fait quelques comparaisons entre différents langages.

Categories
Programming Python

Performances de Python 3.*

Bonne nouvelle, il semble que les performances de Python 3 s’améliorent significativement. Nous sommes nombreux à avoir constaté un effondrement des performances surtout lors de l’utilisation d’itérateurs. J’avais évoqué ce problème en comparant les temps de construction d’un arbre binaire à partir de données récupérées depuis une base MongoDB (avec pymongo). Pour mémoire le chargement de 50.563 articles dans le graphe prenait environ 0,9 secondes avec Python 2.7.3 et 12,9 secondes avec Python 3.2.3. La différence est énorme.

Tableau récapitulatif (temps exprimé en secondes)
Nombre d’articles chargés
dans le graphe
50.563 50.563 50.563 50.563 52.912
Phase Python 2.7.3 Python 3.1.3 Python 3.2.3 3.3.1rc1 3.3.1rc1
Chargement des articles 0,94903397 5,785764 12,9370689 0,5322029 0,5537478
Génération de l’arbre 4,757379 4,3168029 2,733838 2,491816 3,000731
Exécution globale du script 5,950 11,461 15,958 3,225 3,771

Observez les temps en italique dans le tableau (phase Chargement des articles). Python 3.3.1 fait mieux que Python 2.7.3 alors que Python 2.7.3 était beaucoup plus rapide que Python 3.2.3. Le progrès est incontestable, je n’ai rien changé au code utilisé pour ce benchmark. Les améliorations concernant les itérateurs profitent largement à pyAggr3g470r. Si vous utilisez pyAggr3g470r, je vous recommande donc chaudement d’installer Python 3.3.

Pour la phase Génération de l’arbre, avec Python 3.3.1 nous sommes à 2,49 secondes et avec Python 2.7.3 à 4,75 secondes. C’est beaucoup mieux et les itérateurs ne sont pas utilisés à ce niveau. Voyez l’implémentation de l’arbre binaire ordonné utilisée.

Le développement de Python va dans la bonne direction. J’espère que Python 3 sera bientôt par défaut sur la majeure partie des distributions GNU/Linux.

Categories
Computer Programming Python

Quelques benchmarks avec Ackermann

Un billet qui va peut-être intéresser quelqu’un et répondre à une question que je me pose.

$ gcc -Wall ./ackermann.c -o ackermann-c
$ go build -o ackermann-go ./ackermann.go
$ ocamlc ./ackermann.ml -o ackermann-ocaml
$ ghc ./ackermann.hs -o ackermann-haskell
$ python -c "import ackermann-python"

$ time ./ackermann-c 3 12
32765

real    0m4.345s
user    0m4.320s
sys     0m0.012s

$ time ./ackermann-go 3 12
32765

real    0m4.453s
user    0m4.436s
sys     0m0.000s

$ time ./ackermann-ocaml 3 12
32765

real    0m13.094s
user    0m13.053s
sys     0m0.000s

$ time ./ackermann-haskell 3 12
32765

real    1m11.108s
user    1m10.616s
sys     0m0.268s

$ time python ackermann-python.pyc 3 12
32765

real    2m33.121s
user    2m32.518s
sys     0m0.088s

Voici les codes respectifs: ackermann.c, ackermann.go, ackermann.ml, ackermann.hs et ackermann.py. Évidemment, j’ai fais les tests avec la version correspondant à la définition de la fonction (version naïve). Je peux même lancer tous les tests en même temps grâce aux 8 coeurs de l’i7. Ça ne change pas beaucoup les résultats!

Je pense que vous avez compris qu’elle est ma question. J’ai fais plusieurs tests et l’écart entre la version OCaml et Haskell est toujours aussi important (y compris en utilisant ocamlrun ./ackermann-ocaml). Les résultats avec les implémentations C, Go et Python ne sont pas vraiment une surprise.

Il y a tout de même presque une minute de différence entre les versions OCaml et Haskell. J’aimerai bien savoir ce que fait le compilateur OCaml afin d’avoir de si bons résultats (qui ne devrait pas être comparé à du C en fait).