ANTISECHE
Pour ne plus rien oublier !

Comparaison des temps de calculs entre Python et le langage C

samedi 08 juin 2013

Contexte

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.

Application

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.

Codes sources en Python et 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);
}

Résultats des temps de calculs

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.

2 commentaires

#1 vendredi 21 juin 2013 à 19:17 Universale 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 Manu 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

Écrire un commentaire

Contenu de votre message :

Votre nom ou pseudo :

Votre site Internet (facultatif) :

Votre adresse e-mail (facultatif) :

Quelle est la dernière lettre du mot sjgwi ? : 

CopyLeft - 2013-17 - Toutes gauches réservées - Licence CC-BY

Valide xHtml 1.0 STRICT | Fièrement propulsé par PluXml | 0.019s | 9610 vues