Itérateurs: Python 2.7 vs Python 3.2

Voulant tester les performances d’une structure de donnée basée sur un arbre binaire ordonné pour pyAggr3g470r, je maperçois que les opérations sur les itérateurs sont drôlement plus lentes avec Python 3.2.3 qu’avec Python 2.7.3. Je le soupçonnais déjà, mais pas à ce point.

Voici donc la petite implémentation darbre binaire ordonné que j’ai ajouté à pyAggr3g470r. Rien de bien spécial, niveau licence informatique je crois. Le script que voici soccupe:

  • de charger une base MongoDB constituée de 50.563 éléments (730 Mo sur disque);
  • de créer l’arbre avec les 50.563 éléments;
  • d’exécuter quelques opérations de base sur l’arbre: récupérer le plus petit élément (ancien article), récupérer le plus grand élément (récent article) et trouver la profondeur maximum de l’arbre (chemin le plus long).

Devinez quelle partie prend le plus de temps? Attention la différence est surprenante. Voyez.

Avec Python 2.7.3:

$ time python testbinarytree.py
Loading articles from the database…
50563 articles loaded in 0.949033975601 seconds.
Generating the binary tree…
Generation done in 4.757379 seconds.
Maximum depth of the tree:
512
Oldest article:
2002-05-11 04:14 - Testing
Newest article:
2013-03-18 16:32 - Enseignement supérieur L’Uni décroche de bonnes notes

real    0m5.950s
user    0m5.592s
sys     0m0.192s

Avec Python 3.2.3:

$ time python3.2 testbinarytree.py
Loading articles from the database…
50563 articles loaded in 12.937068939208984 seconds.
Generating the binary tree…
Generation done in 2.733838 seconds.
Maximum depth of the tree:
512
Oldest article:
2002-05-11 04:14 - Testing
Newest article:
2013-03-18 16:32 - Enseignement supérieur L’Uni décroche de bonnes notes

real    0m15.958s
user    0m15.529s
sys     0m0.216s

Vous pouvez faire la même chose avec par exemple Python 3.1.3. Le tableau ci-dessous montre l’essentiel.

<th>
  Python 2.7.3
</th>

<th>
  Python 3.1.3
</th>

<th>
  Python 3.2.3
</th>

<th>
  Tendance
</th>
<td>
  0.949033975601
</td>

<td>
  5.785764
</td>

<td>
  12.937068939208984
</td>

<td>
  &darr;
</td>
<td>
  4.757379
</td>

<td>
  4.31680297852
</td>

<td>
  2.733838
</td>

<td>
  &uarr;
</td>
<td>
  5.950
</td>

<td>
  11.461
</td>

<td>
  15.958
</td>

<td>
  &darr;
</td>
Tableau récapitulatif (temps exprimé en secondes)
Phase
Chargement des articles
Génération de l'arbre
Exécution globale du script

Le script s’exécute environ 3 fois plus vite avec Python 2.7.3 malgré une génération de l’arbre binaire 2 secondes plus longue qu’avec Python 3.2.3. La version 2.7.3 lemporte de loin grâce à la phase de chargement de la base MongoDB qui utilise des itérateurs avec PyMongo. Si on enlève le chargement de la base (on pourrait par exemple sérialiser un objet) Python 3.2.3 serait environ plus rapide de 2 secondes. J’ai exécuté les tests de nombreuses fois.

Il n’y a pas photo.

Related Posts