Voici une correction du code python qui permet de vraiment faire le calcul pour savoir si un nombre est, ou non, premier. La différence entre du code optimisé avec psyco et sans cette optimisation est flagrante dans ce genre d'exemple. Mais bon, c'est aussi que c'est juste dans ce genre de fonctions appellées un nombre indéfinissables de fois que psyco excelle.
#! /usr/bin/env python
from time import time
#import psyco
#psyco.full()
MAX=10000
def is_premier( nombre ):
for i in range( 2, nombre/2 ):
if nombre % i == 0: return 0
# print "%d est un nombre premier" % nombre
return 1
start = time()
for n in range( 0, MAX ): is_premier( n )
end = time()
print "tps unitaire: %fs" % ( ( end - start ) / MAX )
print "total: %.03fs" % ( end - start )
Nota: la correction consiste à ne pas tester la division par 1, car sinon le modulo est toujours égal à zéro ... donc le chiffre quel qu'il soit est détecté comme n'étant pas premier. Normal tout nombre est divisible par 1 et par lui même... Même les nombres premiers ^^ À noter aussi que ce genre de fonction n'est pas tip top pour effectuer des benchs, car plus le nombre MAX sera grand plus la fonction sera longue à appeller (à cause du range)... Résultat il faut obligatoirement utiliser la mm valeur MAX quelque soit le langage utilisé pour faire des benchs. D'ailleurs, avec un MAX de 10000, j'obtient 0.016ms par appel à is_premier() en utilisant psyco et 0.296ms par appel sans l'utiliser. No comment.
# Correction du code python
Posté par Julien Portalier . En réponse au message bench : pourquoi python serait lent ?. Évalué à 2.