Petit duel Python vs PHP

5 06 2009

Qui est le plus rapide ? Encore un inutile mais ô combien indispensable test de rapidité. Avec une surprise à la clé.

Les challengers

À ma gauche, l’incontournable des sites web : PHP dans sa version 5.2.4-2ubuntu5.6 with Suhosin-Patch 0.9.6.2.

À ma droite, le chouchou des langages interprétés embarqués : Python dans sa version 2.5.2.

Le script à pousser

Le script servant de test correspond à ma réponse fournie au défi geek #2 de Chrogeek.

Voici la version PHP :

<?php
function alphageek($n) {
  if(!$n) return "a";
  $r=rtrim($n,"z");
  if($r==$n) return substr($n,0,-1).chr(ord(substr($n,-1))+1);
  return alphageek($r).str_repeat("a",strlen($n)-strlen($r));
}

$chaine='a';
for($i=0;$i<5000000;$i++) {
  $chaine=alphageek($chaine);
}
?>

Voici la version Python :

#!/usr/bin/python
def alphageek(n):
  if not n: return "a"
  r=n.rstrip('z')
  if r==n: return n[0:-1]+chr(ord(n[-1])+1)
  return alphageek(r)+'a'*(len(n)-len(r))

chaine="a"
for i in range(0,5000000):
  chaine=alphageek(chaine)

Cette fonction travaille essentiellement sur des chaînes de caractères.

Une boucle de 5.000.000 d’appels met également à contribution le gestionnaire mémoire des deux langages.

Résultats

Le test s’effectue très simplement sous Linux :

time php alphageek.php
time python alphageek.py

Cela donne les résultats suivants en secondes sur un Q6600 :

PHP Python
real 12,269 6,059
user 12,249 5,956
sys 0,020 0,100

Notes :

  • les résultats ont été pris au bout de plusieurs lancements afin de limiter l’impact d’un chargement à froid des deux environnements,
  • le système disposait de plus de 2 Go de mémoire libre.
  • real=temps total, user=temps consommé par le processus, sys=temps consommé par le système d’exploitation.

Pas de doute, Python est deux fois plus rapide sur ce coup-là.

Par contre, j’ai été intrigué par l’utilisation du système qui est cinq fois plus élevée pour Python que pour PHP.

J’ai donc poussé les tests à 10.000.000 d’itérations. Voici les résultats :

PHP Python
real 20,187 11,786
user 20,149 11,533
sys 0,024 0,252

2 surprises :

  • PHP utilise très peu le système pour l’exécution de la fonction alors que Python le fait intervenir,
  • Python semble nécessiter 2 fois plus de temps pour effectuer 2 fois plus d’itérations (linéaire) quand PHP ne met que 1,6 fois plus de temps.

Une autre surprise

Décidément, je vais de surprise en surprise.

J’ai en permanence un moniteur système dans ma barre de menu. Et j’ai vu l’utilisation mémoire grimper avec Python.

J’ai regardé plus précisément et ça donne ceci pour le test des 10.000.000 d’itérations :

  • PHP : 3,5 Mio
  • Python : 312,2 Mio

Outch ! La facture est très lourde pour Python !

On comprend qu’un langage interprété nécessite un environnement de base pour s’exécuter, mais que peut bien faire Python avec plus de 300 Mio ?

Ça vient peut-être de ma configuration sur laquelle bon nombre d’extensions ont été ajoutées. Ou bien parce que j’ai déjà un serveur Apache avec PHP qui tourne ? Va savoir !


Actions

Information

10 responses

13 06 2009
Simon

Il serait intéressant de voir à partir de combien d’itérations le script PHP devient plus rapide que le script Python…

13 06 2009
zigazou

Il faudrait aussi que je fasse le test avec Python 2.6 pour voir si le problème mémoire a été résolu (ou si c’était seulement un problème sur ma machine).

Probablement à l’occasion d’un prochain billet car je me suis aussi amusé à écrire la routine en C, optimisé de surcroit…

11 07 2009
Sbeex

Sympa ce petit test ! Je pense que je vais continuer sous php ^^

11 07 2009
zigazou

Pas nécessairement !

J’ai pu trouver d’où venait le problème de consommation mémoire : c’est l’utilisation de l’instruction range.

Cette instruction génère une liste. Résultat : si je demande range(0,5000000), Python va créer une liste de 5 millions d’éléments… Ce n’est pas un équivalent direct de la boucle for.

Pour éviter cela, il faut passer par l’instruction xrange qui corrige ce défaut (qui n’est un defaut que dans le cas présent)

26 11 2009
Islam Abou El Ata

Mais je ne sais pas si on pourrait s’appuier sur un seul exemple pour conclure que Python est plus rapide que PHP.
Je préfère dire que les deux langages font de leur mieux, qu’ils sont dans le même ordre de grandeur en ce qui concerne la performance, et qu’il convient d’utiliser celui qu’on sent le mieux et qu’on maitrise le plus.

26 11 2009
zigazou

Ce test met surtout en avant la rapidité de traitement des chaînes de caractères, l’un des traitements les plus utilisés de nos jours sur des sites web. Et sur cet aspect, Python semble avoir un bon avantage.

Pour faire une vrai différence, il faudrait aussi tester la vitesse de traitement des structures complexes comme les tableaux indexés par des chaînes de caractères ainsi que la présence d’un grand nombre de fonctions et procédures (démarrage et temps de branchement).

23 12 2009
Tom

Heuu… Ce genre de test sert pas à grand chose, dans le web le seul vrai test utile est un test de charge.

La tu peux voir que Python peut gérer plus de connection que Php avec moins de ressources.

Sinon les tests avec une boucle de 5 000 000…. franchement, à quoi ça sert?

23 12 2009
zigazou

→ Ce genre de test sert pas à grand chose
Comme la plupart des tests 😉

→ dans le web le seul vrai test utile est un test de charge. Là tu peux voir que Python peut gérer plus de connection que Php avec moins de ressources.

Je veux bien l’adresse du test, ça m’intéresse !

Tu me reproches de faire un test inutile. En l’absence d’explication et de détails sur le modus operandi, ta précision me le semble tout autant. Python peut gérer plus de connexions que PHP avec moins de ressources ? Ça veut dire quoi ? Tu parles de quelles ressources ? Bande passante ? Mémoire ? CPU ? Configuration mono-serveur ? Et le test de charge, il a été fait avec quoi ? Avec quel programme ? Dans quelles conditions ?

Je suis ouvert à tout débat, à toute discussion. Mais il ne faut pas venir en disant juste “c’est nul, l’autre en face est plus mieux”.

Me trompé-je ou considères-tu que je suis un pro-PHP dans l’histoire ? Ce qui est loin d’être le cas puisque tout démontre que Python s’en sorte mieux que PHP, le coup de la consommation mémoire étant une erreur de programmation de ma part, erreur que j’ai reconnue dans une réponse à un commentaire.

Et comme indiqué dans un précédent commentaire, le test met en avant la rapidité de traitement des chaînes de caractères de Python par rapport à PHP, traitement que je considère comme le plus utilisé par les moteurs des sites web.

→ Sinon les tests avec une boucle de 5 000 000…. franchement, à quoi ça sert?

À rien ! Comme dans la plupart des tests ! 😉

La seule façon d’obtenir des tests probants sur des aspects précis avec les machines d’aujourd’hui, c’est de charger la mule. Oui, tu n’auras jamais dans la vie réelle (enfin j’espère pour toi) de traitement nécessitant une boucle de 5 millions d’itérations mais je ne vois pas vraiment comment tu peux évaluer précisément le temps moyen sans utiliser ce type de boucle. À moins qu’il n’existe de nouvelles méthodes (je ne suis pas au courant de tout) que je serais ravi de connaître.

De plus, le fait d’avoir un temps de traitement important permet de masquer les temps de chargement, d’initialisation et de finalisation des environnements afin de se concentrer sur le traitement à proprement parler. Si le traitement étudié prend moins de temps que le chargement, l’initialisation et la finalisation, on comparera uniquement ces derniers aspects de PHP et de Python. Et encore… juste pour leur partie “commande en ligne”.

19 02 2010
becoupama

Salut, merci pour ce bench… qui me laisse très perplexe, voici mes résultats pour 50000 itérations, et là… surprise !

time php alphageek.php
real 0m3.478s
user 0m3.370s
sys 0m0.110s

time python alphageek.py
real 0m5.167s
user 0m4.730s
sys 0m0.080s

matériel : intel xscale 600MHz, 512Mo RAM, debian lenny armel.
résultats parfaitement stables d’une exécution sur l’autre.

19 02 2010
becoupama

j’oubliais, python 2.5.2 et php 5.3.1… je précise que c’est le second benchmark du style que je fais, le premier donnait aussi php vainqueur dans les mêmes proportions, bon bref, le matériel doit jouer un max… mais si python tarte sur grosse bécane et php sur de l’embarqué au lieu du contraire, c’est… chtipeu bête 😉

Laisser un commentaire