Parallele Programmierung auf dem Raspberry Pi
Seite 3: Cython
Einführung in Cython
Laut Wikipedia ist Cython "eine Programmiersprache, die weitgehend zu Python kompatibel ist". Die offizielle Cython-Seite fasst das Ganze noch kürzer zusammen: "Cython ist Python mit C-Datentypen." Anders gesagt: Jeder Teil Python-Code ist (mit einigen Ausnahmen) ein gültiger Teil Cython-Code. Die Anbindung externer Bibliotheken ist ebenfalls möglich. Die Stärke von Cython liegt in der Übersetzung des Python-Codes in die C-Sprache, die kompiliert wird und damit eine bessere Performance liefert.
Achtung: Cython erzeugt kein selbstständiges Programm aus den Python-Sourcen! Der kompilierte Code wird lediglich als externes Modul im Python-Programm importiert. Somit ist Cython ein Compiler für den normalen Python-Code, der die Bequemlichkeit der Skriptsprache – darunter der Verzicht auf Zeiger und die mit ihnen verbundene Gefahr der Zugriffs- und Speicherverletzung – mit der Schnelligkeit von C verbindet. Vor der Nutzung auf dem Raspberry Pi müssen Entwickler Cython von der Herstellerseite herunterladen und installieren.
Da die Aufgabe die Übersetzung von Python- in C-Code mit anschließender Kompilierung ist, benötigt Cython einen C-Compiler. Für Linux wie Rasbian gibt es den GNU-C-Compiler, was die Cython-Installation wesentlich vereinfacht und auf zwei Befehle im Terminal (PuTTY etc.) reduziert:
# Pythons Bibliotheken aktualisieren
sudo apt-get install python-pip python-dev
# Erst Cython-Archiv von www.cython.org herunterladen und extrahieren
python setup.py install
Der kleine Einplatinencomputer braucht etwa 20 Minuten intensiver Arbeit, bis er endlich mit der Installation vom Cython fertig ist (s. Abb. 6). Anschließend wird es Zeit, den bestehenden Python- in Cython-Code umzuwandeln.
Der erste Schritt ist das Umbenennen einer .py-Datei mit dem Python-Code in eine .pyx Datei. Damit ist die erste "Hürde" überwunden, und es gibt eine Datei ohne jegliche Code-Änderung, die Cython übersetzen kann. Das Kompilieren erfolgt entweder manuell oder via einer setup.py-Datei, die folgendermaßen aussehen kann:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules =
cythonize("oracle_lsnr_multiprocessing_mapreduce_test.pyx")
)
Der Aufruf in PuTTY geschieht folgendermaßen:
python setup.py build_ext --inplace
Cython produziert eine .c-Datei und kompiliert sie zu einem externen Modul, das das Python-Programm später importiert. Das Hauptprogramm mutiert zu einer Hülse rund um das kompilierte Modul:
import oracle_lsnr_multiprocessing_mapreduce_test
oracle_lsnr_multiprocessing_mapreduce_test.main()
Wer sich die manuelle Kompilierung und das Erstellen der setup.py-Datei ersparen will, kann das pyximport-Modul verwenden, das zum Lieferumfang von Cython gehört und alles "on the fly" erledigt:
import pyximport; pyximport.install()
import oracle_lsnr_multiprocessing_mapreduce_test
oracle_lsnr_multiprocessing_mapreduce_test.main()
Bereits durch diese bescheidene Cythonisierung verarbeitete der kleine Zwerg die XML-Dateien in 40 statt 49 Minuten. Das klingt zunächst bescheiden, entspricht aber einer um 20 Prozent schnelleren Verarbeitung. Somit bringt eine kleine Anpassung ohne wesentliche Codeänderungen eine relativ große Wirkung. Geht es vielleicht noch einen Tick schneller?