ANTISECHE
Pour ne plus rien oublier !

Quand Python et le langage C ne font plus qu'un

mercredi 12 juin 2013

Contexte

Il est parfois nécessaire de faire des calculs long nécessitant donc d'être au maximum optimisés et, en même temps, on souhaite une jolie interface graphique avec plein d'options. Si vous attaquez ce genre de projets en langage C vous pourrez profiter d'une rapidité de calculs inégalée Cependant, le temps et vos nerfs, pour développer l'interface graphique et tout ce que vous souhaitez en plus, seront mis à fortes contributions. Si, d'un autre côté, vous choisissez la voix de Python, vous aurez alors une superbe Ferrari avec un moteur de deux cheveux.

Alors, que choisir ?

Et bien, ne choisissons pas, faisons les deux

Ce qui est génial avec Python, c'est que l'on peut tout faire, si si, vraiment tout. Par exemple, on peu mélanger du C dans du Python. Bon, c'est pas exactement ça. Disons plutôt que l'on peut exécuter des fonctions en C depuis un code Python. Et vous allez voir, c'est vraiment simple.

Application

Je vous propose de modéliser, en fois encore, la découverte de Pi par la méthode de Monté Carlo. Je sais, je vous la sert à toutes les sauces mais elle a l'avantage d'être simple à comprendre tout en mettant à rude épreuve les processeurs de nos ordinateurs.

Je vous propose donc le code C suivant :

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>

double calculPi (unsigned long long histoires)
{
	// 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<histoires;i++)
	{
		x = ((double) rand() / (RAND_MAX));
		y = ((double) rand() / (RAND_MAX));
		
		r = sqrt(x*x + y*y);
		
		if(r <= 1)
		{
			compteur++;
		}
	}
	
	return 4 * compteur / histoires;
}

Comme vous pouvez le voir, il n'y a pas de fonction main(). Nous ne voulons pas un programme complet en C mais seulement une simple fonction que nous appellerons depuis Python.

Pour compiler ce programme sous GNU/Linux, j'utilise la commande ci-dessous. J'imagine que sous Windows, ça doit se rapprocher plus ou moins de ça.

$ gcc -shared -lm -O3 -fPIC Pi.c -o MonteCarloPi.so

Me voilà maintenant avec une librairie partagée MonteCarloPi.so comprenant une seule fonction que je vais maintenant pouvoir appeler depuis Python. Pour cela, nous allons utiliser le module ctypes. Puis, nous ouvrons notre bibliothèque partagée MonteCarloPi.so. On précise pour chacunes des fonctions de la librairie, le format des données retournées par les fonctions. Et ainsi, on peut utiliser en toute transparence les fonctions en C comme si elles étaient de simples fonctions Python.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ctypes				# Importation du module nécessaire

lib = ctypes.CDLL('./MonteCarloPi.so')	# Ouverture de la librairie partagée
lib.calculPi.restype = ctypes.c_double	# On précise le type du retour de la fonction en C

print(lib.calculPi(10000000))		# On exécute la fonction en C puis on affiche le résultat

Voilà, maintenant, en développant vos algorithmes qui nécessitent du temps de calculs en C, vous pourrez accélérer considérablement vos programmes Python.

Aucun commentaire

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 première lettre du mot kslwx ? : 

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

Valide xHtml 1.0 STRICT | Fièrement propulsé par PluXml | 0.018s | 2952 vues