29.Jan 2007
C-Funktionen in Python
Für rechenintensive Vorgänge sind Skriptsprachen nicht immer performant genug. Python bietet über das ctypes-Paket einen komfortablen Weg, dynamische Bibliotheken einzubinden.
// fibonacci.c
int fibonacci( int n ) {
if( n > 2 )
return fibonacci( n - 1 ) + fibonacci( n - 2 );
else
return 1;
}
Um den Quellcodes als Bibliothek zu übersetzen, dienen folgende Kommandos:
gcc -c -fpic fibonacci.c
gcc -shared fibonacci.o -o fibonacci.so
Zum direkten Performancevergleich habe ich die Fibonacci-Funktion zusätzlich in Python eingebunden.
# fibonaccy.py
def fibonacci( n ):
if n > 2:
return fibonacci( n - 1 ) + fibonacci( n - 2 )
else:
return 1
# Python-Variante ausfuehren
print fibonacci(32);
# C-Version einbinden und ausfuehren
import ctypes
DLib = ctypes.cdll.LoadLibrary( "fibonacci.so" )
print DLib.fibonacci(32)
Zum Ausführen muss gegebenenfalls noch der Bibliothekspfad um das eigene Verzeichnis erweitert werden:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./fibonacci.py