Bonjour,
Ça y est!!!
Voilà mon code test:
bib.cpp
bib.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include "bib.h" int add_(int a, int b){ return a+b; } int pgcd_(int a, int b){ int r; while (b!=0) { r = a%b; a = b; b = r; } return a; }
calcul.pyx
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int add_(int a, int b); int pgcd_(int a, int b);
setup.py:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import division # Python 2.7 from cpython cimport bool, list, dict, tuple, long as llong from cython import cclass, ccall, cfunc, returns as creturns, locals as clocals cdef extern from "bib.h": cdef int add_(int x, int y) cdef int pgcd_(int a, int b) ############################################################################# @ccall @creturns(int) @clocals(x=int, y=int) def add(x, y): """addition de x et y""" return add_(x,y) ############################################################################# @ccall @creturns(int) @clocals(a=int, b=int) def pgcd(a, b): """PGCD de a et de b""" return pgcd_(a,b)
compilation en console par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [Extension("calcul", sources=["calcul.pyx", "bib.cpp"], include_dirs=["."], language="c++" ) ] setup( name = 'Demos', ext_modules = ext_modules, cmdclass = {'build_ext': build_ext}, )
Ce qui donne "calcul.pyd sous Windows, ou "calcul.so" sous Unix
Code : Sélectionner tout - Visualiser dans une fenêtre à part python setup.py build_ext --inplace
Utilisation:
Ce qui donne les bons résultats (18 et 14)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import division # Python 2.7 from calcul import add, pgcd print add(7, 11) print pgcd(56,42)
Contrairement à ce que je pensais, la partie de code en C++ (bib.cpp) n'est pas compilée en bibliothèque indépendante, mais liée au code Cython.
J'ai essayé avec Windows (compilateur Visual C++ et mingw32) et Mint13 compatible Ubuntu 12.04: tout fonctionne parfaitement.
A noter que l'exemple à télécharger fonctionne aussi parfaitement, et contient du code plus complexe (classes C++): si nécessaire, il pourrait être intéressant de s'y reporter.
Ok?
[Edit] niveau performance, la solution du pgcd directement codé en C++ est 4 fois plus rapide que la version en Python pourtant déjà rapide (merci Euclide!). Condition d'essai: 1 million de valeurs de a et de b au hasard, comprises entre 100 et 100000.
Partager