Il est évidement que le langage C est beaucoup plus rapide que Python puisqu'il est directement compilé pour la plate-forme sur laquelle il tourne. Il profite directement des spécifications de la plate-forme sans passer par une machine virtuelle. Python, quant à lui, est prévu pour fonctionner sur toutes les plate-formes de la même façon sans nécessiter le moindre changement dans le code source du programme. De plus, il profite d'un typage dynamique des variables qui nous permet un gain de temps considérable lors de l’écriture d'un programme au détriment évidement du temps d’exécution. Il est donc sûr qu'un programme en Python mettra plus de temps à s'exécuter qu'un programme en C mais essayons tout de même de savoir comment on se situe.
Je vous propose un cas concret. Calculons une valeur approchée de Pi par la méthode de Monté Carlo et observons le temps de calcul en Python puis en C.
En python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from math import sqrt # Importation de la fonction racine carré
from random import random # Importation de la fonction aléatoire
NombreHistoires = 10000000 # Nombre de réalisations d'histoires
Compteur= 0 # Nombre de fois que l'on se trouve dans le cercle
for i in range(NombreHistoires):
x = random() # Composante sur x aléatoire
y = random() # Composante sur y aléatoire
r = sqrt(x*x+y*y) # Calcul de la distance entre le centre et le point
if r <= 1: # Vérification que le point se trouve dans le cercle
Compteur = Compteur + 1
Pi = 4 * Compteur / NombreHistoires
print("Pi = %f" % Pi)
En langage C:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
// Déclaration de notre constante qui contient le nombre d'histoires
#define NOMBRE_HISTOIRES 10000000
int main()
{
// Déclaration des variables
double x = 0;
double y = 0;
double r =0;
double i = 0;
double compteur = 0;
// Initialisation de la suite de nombres pseudo-aléatoires
srand(time(NULL));
// On boucle le nombre d'histoires
for(i=0;i < NOMBRE_HISTOIRES;i++)
{
x = ((double) rand() / (RAND_MAX));
y = ((double) rand() / (RAND_MAX));
r = sqrt(x*x + y*y);
if(r <= 1)
{
compteur++;
}
}
printf("Pi = %lf\n", 4 * compteur / NOMBRE_HISTOIRES);
}
Pour le programme en Python:
$ time python Pi.py Pi = 3.141870 real 0m8.343s user 0m8.337s sys 0m0.013s
Pour le programme en langage C:
$ time ./a.out Pi = 3.141098 real 0m0.325s user 0m0.323s sys 0m0.000s
En Python, le calcul a mis 8,34s et, en langage C seulement 0,32s soit un rapport de 26.
CopyLeft - 2013-17 - Toutes gauches réservées - Licence CC-BY
Valide xHtml 1.0 STRICT | Fièrement propulsé par PluXml | 0.017s | 141500 vues
2 commentaires
#1 vendredi 21 juin 2013 à 19:17 a dit :
Je reconnais que le langage C est plus rapide que Python mais il y a une grande part aussi sur ton code, on peut faire largement moins que 8,34 sec en Python. Et puis je trouve le code en Python beaucoup plus compréhensible ( chacun son avis mais on doit reconnaître le niveau de Python tout de même ).
#2 jeudi 25 juillet 2013 à 21:24 a dit :
@Universale :
Je suis un fervent utilisateur de Python. Il s'agit là seulement d'une critique constructive et surtout une introduction à l'article suivant qui traite de ctype.
Par contre, s'il y a une solution pour optimiser la version en Python, ça m'intéresse !
Fil RSS des commentaires de cet article