티스토리 수익 글 보기

티스토리 수익 글 보기

Python – Software und Beratung – Dr. Ing. Stefan Behnel
Foto von Stefan Behnel

Dr. Ing. Stefan Behnel

Python – Software und Beratung

    »der leichte Weg zu schnellem Code«

Wer bin ich?

Ich bin ein erfahrener Open-Source Software-Entwickler, IT-Trainer und Consultant im Python-Umfeld, Gründungsmitglied des Python Software Verband e.V., und “Fellow” der Python Software Foundation (PSF). Die meisten meiner Projekte befassen sich mit High-Performance-Tools und schnellem Code. Ich arbeite an diesen Projekten weil ich es mag, performance-kritischen Code zu optimieren. Und weil ich es mag, Software-Werkzeuge zu schreiben, die es Entwicklern leicht machen, schnellen Code zu schreiben. Denn mit den richtigen Werkzeugen wird das wirklich einfach.

Mein Doktortitel wurde mir von der Technischen Universität Darmstadt am Institut für Datenbanken und Verteilte Systeme verliehen, das von Professor Alejandro Buchmann geleitet wurde. Meine Doktorarbeit über effiziente, modellbasierte Software-Entwicklung von hochskalierbaren, selbstverwaltenden verteilten Systemen ist online verfügbar.

Was biete ich an?

  • Vorträge und Schulungen (auch In-House)
  • Software-Entwicklung und Optimierung
  • Professionelle Code-Reviews
  • Beratung
insbesondere zu den Themen
  • Python Performance-Optimierung
  • High-Performance XML-Verarbeitung
  • Cython-Programmierung.

Aktuell wohne ich in Celle, in der Nähe von Hannover, aber auch längere Anreisen sind kein Problem.
Bitte kontaktieren Sie mich unter der Adresse < consulting (AT) behnel.de >.

Ausgewählte Vorträge

Projektangebot

Die folgende Liste nennt einige interessante Software-Entwicklungsprojekte die ich gerne umsetzen würde. Wenn Sie Interesse an deren Implementierung haben und sie finanziell unterstützen möchten, kontaktieren Sie mich bitte unter der Adresse < consulting (AT) behnel.de >.

  • Offene Aufgaben rund um das Cython Compiler Projekt:
    • Neuimplementierung von “Inlined Generator Expressions”: Vor der vollständigen Unterstützung für Generatoren (“yield”) boten Cython 0.13 und 0.14 eine Optimierung für bestimmte Generator-Ausdrücke. Wenn diese in Builtins hineingereicht werden, konnte in einigen Fällen der Generator in eine einfache Schleife umgewandelt werden. Dies bringt einen beachtlichen Geschwindigkeitsvorteil, da erstens der wiederholte Aufrufaufwand für den Generator wegfällt und zweitens Cython in vielen Fällen den Datentyp des Ergebnisses besser optimieren kann. Leider kollidierte die ursprüngliche Optimierung mit der späteren Implementierung von allgemeinen Generatoren und musste entfernt werden. Die Aufwandsschätzung für eine Neuimplementierung beträgt etwa zehn bis 15 Tage.
    • Sprachunterstützung für “borrowed references”: In der Sprache Cython gibt es bisher keine Unterstützung für Objektreferenzen, die nicht dem Reference-Counting unterliegen. Daher haben alle Zuweisungen von Objektreferenzen leichte Performance-Auswirkungen und können weniger gut durch den C-Compiler optimiert werden. Auch sind Objektreferenzen nicht innerhalb von Code-Blöcken erlaubt, die den “global interpreter lock” (GIL) von CPython freigeben. Sprachunterstützung für geliehene Referenzen würde somit einfacheren und schnelleren Code erlauben. Der Status dieses Features findet sich in Trac-Ticket 498. Die Aufwandsschätzung beträgt etwa zehn Tage für die explizite Sprachunterstützung sowie optional einige weitere Tage für darauf aufbauende Optimierungen des Compilers um dieses Feature wo möglich auch ohne explizite Deklaration zu verwenden.
  • Offene Aufgaben rund um das lxml Projekt:
    • Dokument-Locks: lxml hat eine lange Historie von Threading-Problemen und verwendet Threading daher nur an sehr ausgewählten und sicheren Stellen. Das reduziert die Parallelität bei der XML-Verarbeitung weit unter das Mögliche. Ziel dieses Projekts ist es, Locking auf Dokument-Ebene zu implementieren, so dass der GIL bei mehr Operationen sicher frei gegeben werden kann. Die Aufwandsschätzung beträgt etwa zehn bis 15 Tage.
    • Bessere Parallelität beim inkrementellen Parsen: Aktuell speichert lxml SAX-Events auf Python-Ebene und benötigt dazu bei jedem Ausruf aus libxml2 den GIL (Pythons Global Interpreter Lock). Ziel dieses Projektes ist es, die Events auf C-Ebene zwischenzuspeichern und erst nach Abarbeitung eines Datenblocks in Python-Events umzuwandeln. Dadurch könnte der GIL für die gesamte Dauer des Parsens eines Datenblockes freigegeben werden, was zu wesentlich besserer Parallelität und Performance führt. Die Aufwandsschätzung beträgt etwa zehn Tage.
  • Offene Aufgaben rund um das Lupa Projekt:
    • Direkte Unterstützung für Pythons Buffer-Interface in Lua: Seit Version 2.6 hat CPython eine exzellente C-Schnittstelle zum Zugriff auf interne Datenspeicherbereiche, so auch auf Matrizen in NumPy. Die Integration in Lupa würde eine direkte und sehr effiziente Verwendung dieser Speicher aus Lua-Code heraus ermöglichen, insbesondere durch LuaJITs neue, schnelle FFI-API.

Projektreferenzen

Die wichtigsten Projekte, an denen ich in den letzten Jahren gearbeitet habe, sind lxml und Cython. Lupa ist ein neues Projekt, das sich noch in seien Anfängen befindet.

Cython

http://cython.org

Die Programmiersprache Cython ist ein Dialekt der Sprache Python. Sie bietet optionale statische Typ-Deklarationen und wird in schnellen C-Code übersetzt. Ihre Anwendungsgebiete als allgemeine Programmiersprache sind breit gestreut. Vor allem im Bereich des Scientific Computing ist sie aber einer der Gründe für die weite Verbreitung von Python als eine der wichtigsten Programmiersprachen. Nicht unbedingt, weil sie Fortran ersetzen wollte. Sondern weil es wesentlich einfacher ist, den Hauptteil des Codes in einer Hochsprache zu schreiben, und ihn dann mit kleinen Mengen an handoptimiertem low-level Code zusammenzufügen.

Cython ist eine perfekte 80/20 Sprache. Es verbindet auf einzigartige Weise eine hohe Entwicklungsgeschwindigkeit beim Großteil des Source-Codes einer Anwendung mit der leichten Optimierbarkeit kleiner, kritischer Code-Teile. Zusätzlich zu der leichten und schnellen Software-Entwicklung, für die Python bekannt ist, erlaubt Cython eine merkliche Code-Beschleunigung durch das einfache Hinzufügen statischer Typ-Deklarationen in genau den performance-kritischen Sektionen, die sich in Benchmarks offenbaren. Und wenn blanke Performance gefragt ist, lassen sich sehr leicht einzelne Code-Bereiche in C, C++, Fortran oder kompatiblen Sprachen reimplementieren und einbinden.

Meine Leistungen als Mitbegründer und Core-Entwickler des Cython-Projekts beinhalten zahlreiche Compiler-Optimierungen auf allen Ebenen, wichtige Design-Entscheidungen und die Implementierung mehrerer großer Features aus der Programmiersprache Python. Zudem zeichne ich mich für Design und Implementierung einiger Sprach-Features verantwortlich, die Cython zu einer einzigartigen Sprache in der Integration von Python und C machen.

lxml

http://lxml.de

Nach mehreren Jahren stetiger Weiterentwicklung hat sich lxml längst den Titel der führenden high-performance XML-Bibliothek für Python erworben. Es bietet eine einzigartige Kombination aus zahllosen XML-Features, einer sehr hohen Geschwindigkeit und einer erstaunlichen Leichtigkeit der Benutzung. Die wohlbekannten C-Bibliotheken libxml2 and libxslt bilden die standard-konforme Basis, die lxml mit Hilfe von Cython zu einer hochintegrierten, objekt-orientierten XML-API verbindet.

Als Leiter des lxml Projekts bin ich für die wesentlichen Entwicklungen an der Code-Basis verantwortlich, für Design und Projekt-Management. Zudem entwickelte ich einen großen Teil der Implementierung, der wichtigsten Features und Performance-Optimierungen, die lxml so nützlich für die XML-Verarbeitung unter Python machen.

Lupa

https://github.com/scoder/lupa

Lupa ist ein Python-Wrapper für die schnelle Lua-Laufzeitumgebung LuaJIT2. Es ist in Cython implementiert und ermöglicht die bidirektionale Kommunikation zwischen Lua-Code und Python-Code.

Lua ist eine sehr gute Ergänzung zu Python. Als Sprache ist es ähnlich dynamisch wie Python, aber LuaJIT übersetzt es in sehr schnellen Maschinencode, teilweise sogar schneller als viele statisch kompilierte Sprachen. Die Laufzeitumgebung ist extrem klein und in allen Bereichen auf Embedding optimiert. Das vollständige Binärmodul von Lupa, inklusive der statisch eingebundenen LuaJIT2 Umgebung, ist auf einem 64-bit System gerade einmal 500KB groß.

Jedoch lassen Lua und seine Umgebung auch einiges vermissen was Python-Entwickler als selbstverständlich ansehen, sei es als Teil der Python Standardbibliothek (“Batteries included”) oder an verfügbaren Bibliotheken und Entwicklerwerkzeugen. Diese Beschränkungen machen die Entwicklung von Lua-Anwendungen aufwändiger als vergleichbare Python-Anwendungen. Daher wird Lua nur selten als Hauptentwicklungssprache für größere Anwendungen verwendet. Als schnelle, dynamische und speicherfreundliche Hilfssprache innerhalb der Python Laufzeitumgebung macht es jedoch eine sehr gute Figur wenn hohe Geschwindigkeit gefragt ist und die Umlaufzeit des “edit-compile-run” Zyklus zu schwerfällig für agile Code-Entwicklung und das Hot-Deployment von Software-Komponenten wird.

Als Leiter des Lupa Projekts bin ich für die wesentlichen Entwicklungen an der Code-Basis verantwortlich, für Design und Projekt-Management ebenso wie für die Implementierung.

Veröffentlichungen