Seite 1 von 1

Python *zur Laufzeit* mit C-Code erweitern

Verfasst: Donnerstag 19. Juni 2003, 16:20
von joerg
Hallo,
ich habe gerade angefangen, Python und
tcc (Tiny C Compiler - http://fabrice.bellard.free.fr/tcc/ ) zu verheiraten.
Konkret gibt es ein (rudimentäres) Modul, um den Compiler anzusteuern.

Es ist schon möglich, einen Python-String direkt im Arbeitsspeicher kompilieren, zum laufenden Interpreter linken zu lassen, und Funktionen daraus aufzurufen, und das alles wahnsinnig schnell. ;-)

Ein Beispiel:

Code: Alles auswählen

import tcc

cCode = """
#include "Python.h"
PyObject *mySum(PyObject *seq) {
  double s = 0.0;
  int i, j = PySequence_Length(seq);
  for (i = 0; i < j; i++)
    s += PyFloat_AsDouble(PySequence_GetItem(seq, i));
  return Py_BuildValue("d", s);
}

PyObject *myProd(PyObject *seq) {
  double s = 1.0;
  int i, j = PySequence_Length(seq);
  for (i = 0; i < j; i++)
    s *= PyFloat_AsDouble(PySequence_GetItem(seq, i));
  return Py_BuildValue("d", s);
}
"""

s = tcc.TccState()
s.addIncludePath('/usr/include/python2.2')
s.compileString(cCode)
s.relocate()

x = [float(i) for i in range(1, 10)]

# Gibt 45 und 3628800 :-)
print s.runSimpleFunction('mySum', x), s.runSimpleFunction('myProd', x)
(Der C-Code dient nur zur Anschauung, da fehlt z.B. die Fehlerbehandlung).

Der Nachteil: Läuft nur auf Linux/x86 (wegen tcc).

Weiterentwicklung je nach Zeit und Lust (und Bedarf).

Jörg

Verfasst: Donnerstag 19. Juni 2003, 22:49
von Beyond
Cool