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