Seite 1 von 1

Ctypes oder boost::python?

Verfasst: Samstag 18. April 2009, 03:56
von Ike
Hi there!

Ich befasse mich seit kurzem mit Python, und mache meine ersten wackeligen Schritte mit der Sprache (als C und ASM-Coder bin ich soviel "high level" nicht gewöhnt ;) ).
Um eine bestimmte Hardware anzusprechen muss ich von python aus nun auf eine shared lib zugreifen und ihre API benutzen.
Ich bin zuerst auf boost::python gestoßen, welches mir anscheinend die Möglichkeit gibt in C++ meine bisherige Funktionalität neu zu modellieren um sie python-konform zu machen und sie python bekannt zu machen - also einen Wrapper zu schreiben.
Leider ärgert mich die Dokumentation etwas und viele Fragen bleiben unbeantwortet. Ich habe nichtmal herausgefunden wie ich ein Array in einem Struct zu Python exportieren kann.

Nachdem ich dann mit meiner Python-Lektüre (der Schinken von den 2 Info-Studenten aus dem Galileo-Verlag - ja ich weiß, nichts tolles) etwas weiter gekommen bin, wurde mein Blick auf Ctypes gelenkt. Dies ermöglicht mir nun C-Datentypen in Python nachzubilden und entsprechend zu benutzen.
Die Dokumentation war schnell gelesen.

Meine Frage ist nun, was ist praktikabler? Was ist performanter?
Ich muss mit der API teilweise zeitkritische Aktionen veranstalten, da würde es mich eher ärgern wenn der interpreter Lange obskure Datentypen basteln muss.
Viel müsste ich nichtmal nachbilden. Die API setzt sich aus 2 Structs mit ein paar float arrays und 6 funktionen zusammen. Wäre es nicht bloated hier einen Wrapper zu schreiben? Oder kann ich damit performance rausholen?

Also, her mit eurer Meinung :)
Vielleicht auch noch Alternativ-Vorschläge? Ich bin gespannt was die Python-Welt noch so offeriert :)

besten Gruß

Ike

Verfasst: Samstag 18. April 2009, 07:36
von BlackJack
Bei einer C-API würde ich `ctypes` benutzen. Da braucht man nichts weiter zu installieren und das ganze funktioniert auch über mehrere Python-Versionen hinweg. Wenn man eine "binäre" Erweiterung in C oder C++ schreibt, muss man die für jede Python-Minor-Version erneut kompilieren.

Falls doch noch "Glue"-Code auf der C-Seite nötig sein sollte, dann würde ich als erstes mal Cython ins Auge fassen.

Was das "Wrappen" angeht: Irgendwo muss man das ja tun, ob nun auf Python-Seite, oder in einer kompilierten Erweiterung, sollte in den meisten Fällen egal sein.

Versuch's erst einmal mit `ctypes`, das ist IMHO die einfachste Lösung. Wenn du damit dann nicht glücklich bist, kannst Du ja immer noch eine der aufwändigeren Wege beschreiten.

Verfasst: Sonntag 19. April 2009, 00:51
von problembär
Hi,

vielleicht kannst Du auch eine Extension schreiben:

http://openbook.galileocomputing.de/pyt ... 26_002.htm
http://starship.python.net/crew/arcege/ ... pyext.html

Prinzipiell ist das aber einer der schwierigsten Kapitel, und Du denkst für Python IMHO auch immer noch zu kompliziert. Hier in Python ist alles einfach.
Ob das dann aber immer so geeignet für zeitkritische Anwendungen ist, ist eine andere Frage.

Gruß

Verfasst: Sonntag 19. April 2009, 08:01
von BlackJack
Also bevor man anfängt eine "Extension" per Hand zu schreiben, sollte man sich definitiv Cython ansehen. Damit spart man sich eine Menge Arbeit.

Verfasst: Sonntag 19. April 2009, 19:50
von CM
D'accord. Und wenn das noch zu viel Overhead generiert (beispielsweise bei rechenintensivem Kram) kann man noch auf SWIG ausweichen. SWIG ist auch noch relativ einfach - relativ zu boost jedenfalls.

HTH,
Christian