Python-Optimierung: Cython

Der Python-Code ist optimiert. Alle Aufgaben sind parallelisiert, die CPUs laufen alle mit 99%. Die Datenbank ist optimiert. Die Hardware ist ausgereizt. Trotzdem muss noch ein Faktor 30 an Rechenzeit gewonnen werden.

Es gibt nun nur noch wenige Möglichkeiten:

  • Andere Programmiersprache/Plattform/Framework
  • Auslagern von Rechenprozessen in die GPU
  • Optimieren des Python-Codes mit Cython
Keine dieser Möglichkeiten sollte leichtfertig gewählt werden, ohne externe Expertise einzuholen - denn alle kosten viel Geld. Ein externer Spezialist kann evtl. einen vierten Weg aufzeigen.

Wenn doch kein anderer Weg mehr offen steht:

  • ist die erste Option die schlechteste. Die eigene Entwicklermannschaft muss entweder etwas komplett neues lernen oder neue Team-Mitglieder müssen aufwändig ins Team integriert werden.
  • das Auslagern von Prozessen in die GPU kann eine gewaltige Steigerung der Rechenleistung (Faktor100/1000) bringen, wenn das Problem sich entsprechend transformieren lässt. Auch ist zu bedenken, dass entsprechende GPU Hardware/Lizenzen zu kaufen/verwalten sind. Ohne externe Spezialisten kein Chance. Die Anpassungen können aber dann mit geschulten Entwicklern selbst gestemmt werden.
  • Die Optimierung mit Cython (Faktor 2-40) geschieht i.d.R. auch nicht einfach so. Externe Spezialisten können aber schnell einen Wissenstransfer herstellen, der die Inhouse-Entwickler befähigt Ihren bestehenden Code zu optimieren. Auch ist die Cython-Optimierung kaum abhängig von der Problemstellung/Hardware.
Cython ermöglicht es C-artige Subroutinen in Python-Code zu formulieren. Im Python-Code können Variablen mit C-Typen versehen werden. Schleifen und andere Python-Sprachelemente werden dann mit C-Geschwindigkeit (Faktor 40) ausgeführt. Auch ist das Interfacing mit C-Bibliotheken aus Cython heraus einfacher als aus Python. Cython spielt gut zusammen mit Numpy/Scipy Datenstrukturen.

Kursinhalt:

Nach einer einfachen Einführung in die Arbeitsweise von Cython wird ein in Python gegebener Algorithmus (QuadTree) Stück um Stück nach Python portiert.

Bei dieser Portierung lernen Sie Flaschenhälse in Ihrem Python Code zu finden. Denn wir zeigen Ihnen unter welchen Performance-Problemen die Python/Numpy Datenstrukturen leiden.

Dabei werden drei Punkte speziell vertieft:
  • Numpy arrays effektiv aus Cython heraus nutzen mit memory views
  • "Cython extension types": Objektorientiertes Cython und seine Grenzen
  • "Exception handling" : Wie kann man Exceptions aus Cython nach Python leiten.

Kursziel:

Nach erfolgreichem Abschluss diesen Kurses sollten Sie in der Lage sein selber mit Cython:

  • Performante Subroutinen zu erzeugen

  • Mit "Extension types" sogar objektorientiertes Cython zu schreiben.

  • Ein generell besseres Verständnis für Optimierung haben.


Termine