Python CFFI demo: interfacing C++, Fortran, and Python.
Inspired by Armin Ronacher’s
“Beautiful Native Libraries”.
In this example we imagine we are on a desert island and wish to compute pi by
throwing darts:
This example is implemented in 3 different languages (C++, Fortran, Python) and
we demonstrate how to call this functionality across languages.
These 3 implementations are combined in an example Python package that we call pi
.
At the same time we demonstrate how to automatically test the interface and the
3 implementations.
We do not discuss memory allocation strategies.
For this have a look at this demo.
pip install
In this example using Virtual Environments
but also
Anaconda or
Miniconda will do the job:
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt
mkdir build
cd build
cmake ..
make
PI_LIBRARY_DIR=build/lib PI_INCLUDE_DIR=island pytest -vv test.py
This example comes with a full-fledged setup script which configures
and builds the code under the hood and makes it possible to install the demo
with pip
:
virtualenv venv
source venv/bin/activate
pip install git+https://github.com/bast/python-cffi-demo.git
python -c 'import island; print(island.approximate_pi_c(100))'
$ cd build
$ ./bin/pi_cpp.x
pi computed by c = 3.141664
pi computed by fortran = 3.141636
$ ./bin/pi_fortran.x
pi computed by fortran = 3.1416358947753906
pi computed by c = 3.1416640000000000
Default is 2M points but feel free to experiment by increasing the number
of points in test.py
.
$ PI_LIBRARY_DIR=build/lib PI_INCLUDE_DIR=island python test.py
num points: 2000000
python pi=3.14163 time spent: 1.749 sec
c pi=3.14190 time spent: 0.041 sec
fortran pi=3.14225 time spent: 0.126 sec
Feel free to improve the C++, Fortran, and Python codes.
If you know intuitive examples that we can use to demonstrate memory allocation
strategies, please suggest these.