Programmierung mit PythonInhalteDieses Seminar hat keinerlei formellen Vorgaben zum Inhalt, das heisst, es sollte genug Zeit bleiben, um auf die spezifischen Bedürfnisse der Teilnehmer einzugehen. Wichtige Inhalte sind unter anderem:
UnterrichtsmaterialEine Präsentation, die Python und die von Python verwendete Syntax sehr kompakt zusammenfasst steht mit python.pdf zur Verfügung. Die im Unterricht verwendeten, erklärenden Übungen stehen zum Download bereit: Toolspdb - Python DebuggerPython verfügt über mehr als einen bekannten Debugger sowie unterschiedliche Frontends zu diesen. Der Standard - pdb - ist schon bei der Installation von Python dabei und wird mit dem Namen eines Python Moduls aufgerufen: pdb file.py Die wichtigesten Kommandos schließen h(elp) l(ist) [first [,last]] b(reak) ([file:]lineno | function) [, condition], cl(ear) [bpnumber [bpnumber...]] run (restart) s(tep), n(ext), r(eturn), c(ontinute) ein. Lokale Variablen können durch Eingabe ihres Namens angezeigt werden, für globale Variablen ist ein alias aliasname code Solche Alias können in der Datei Dokumentation von pdb findet sich in der offiziellen Python Dokumentation und in dem Artikel Interactive Debugging with Python. IPython ShellIPython bietet gegenüber der regulären Python Shell massive Vorteile, welche Syntax Highlighting, Kommandovervollständigung und die Definition von Makros einschließen. Zuerst muß die Shell installiert werden: sudo aptitude install ipython Besonders nützlich ist es, normale Shellbefehle direkt ausführen zu können, indem man einfach ein dircontent = !ls -l Fügt man ein Fragezeichen an das Ende eines Objekts, so bekommt man Hilfe dazu (object inspection): dir? Weiters stellt IPython sogenannte "magic functions" zur Verfügung, womit sowohl IPython selbst gesteuert werden kann als auch einige Systembefehle besonders einfach ausführbar sind. Generell werden diese Funktionen mit dem Präfix "%" aufgerufen. Einen Überblick über die vorhandenen magic functions bekommt man mit %lsmagic Die Möglichkeiten dieser Funktionen sind sehr weitläufig und schließen persistente Variablen (die Werte bleiben über mehrere IPython Sessions gespeichert), Aliases und die Definition von Makros ein. Detaillierte Hilfe zu den magic functions bekommt man mit dem Befehl %magic Besonders nützlich ist auch die Möglichkeit, einen externen Editor zu verwenden. Damit kann nicht nur eine kompliziertere Befehlszeile verfasst werden, sondern auch eine bereits geschriebene Zeile verändert werden. Es wird jener Editor verwendet, der in der Systemvariable %edit [linenumber] IPython ist über die Datei GNU EmacsEmacs bietet (natürlich) auch exzellente Unterstützung für das Schreiben, Testen und Debuggen von Python Programmen. Es gibt unterschiedliche Python Modi - ich empfehle jedoch, jenen aus dem Packet sudo aptitude install emacs python-mode Python Dateien werden automatisch erkannt und können in Emacs automatisch mit der Tastenkombination [Strg]+[c] [Strg]+[c] ausgeführt werden. Daher ist es praktisch mit Emacs Dinge auszuprobieren, welche für IPython zu groß sind, selbst wenn man Emacs nicht für sein Hauptprojekt verwendet. Die Emacs Speedbar unterstützt Python auch vollständig und erleichtert die Navigation in größeren Projekten. Sie kann mit [Alt]+[x] speedbar aufgerufen werden. Emacs hat auch ein komfortableres Interface zum Python Debugger pdb. Dieser kann in Emacs mit [Alt]+[x] pdb gestartet werden, wobei im folgenden Dialog die Datei angegeben werden muss, welche untersucht werden soll. Besonders fein ist dabei, dass der jeweils aktuelle Kontext in einem eigenen Emacs Window angezeigt wird, während der Debugger in einem anderen aktiv ist. Weitere Informationen über die Verwendung von Emacs als (Python) IDE finden sich im Abschnitt Programmiertools. TestenPython hilft beim Erstellen von Unittests mit dem sudo aptitude install python-nose Es gibt verschiedene Möglichkeiten, nosetests mitzuteilen, welche Klassen Testcases enthalten. Eine einfache Möglichkeit ist es, die Klasse from unittest import TestCase class MyTests(TestCase): def setUp(self): """Executed before every test.""" pass def tearDown(self): """Executed after every test.""" pass def testSomething(self): self.failUnless(1==1) def testFail(self): self.failUnlessEqual(1,2) def testSomethingElse(self): self.failIfEqual(1,3) CodesnippetsVerzeichnisbaumSoll eine Aktion für alle Dateien (oder ein bestimmtes Subset dieser) in einem Verzeichnisbaum ausgeführt werden, so hilft Python mit EXTENSIONS = ["txt", "py"] for root, dirs, files in os.walk(PATH): for filename in [f for f in files if f.split(".")[-1].lower() in EXTENSIONS]: filepath = os.path.join(root, filename) with open(filepath) as f: # do something pass InternasBevor man aufgrund der teilweise langsamen Performance von Python den Code mittels eines Profilers analysiert und dann mit Tools wie zum Beispiel Cython optimiert, kann man schon beim Schreiben des Prototypen mit dem Wissen über ein paar interne Details von Python einiges an Performance herausholen. ListenIntern sind Python Listen nicht verkettete Listen im Sinn der Informatik,
sondern eigentlich Arrays (zusammenhängende Blöcke von
Speicher). Dadurch ist es der Lese- und Schreibzugriff sehr schnell:
PerformanceUm gute Performance zu gewährleisten, muss man sich schon vor der ersten Codezeile überlegen, welche Algorithmen verwendet werden sollen, um die Komplexität niedrig zu halten. Sollte die Performance eines bereits bestehenden Programms jedoch einmal nicht mehr ausreichen, gibt es zahllose Möglichkeiten, diese zu verbessern. Zuerst sollte der Code stets mittels eines Profilers analysiert werden, um herauszufinden, wo die Flaschenhälse versteckt sind (Hilfe zum Thema Profiling findet sich in der Python Dokumentation). In der Regel kann man dann schon durch Anpassen des reinen Python-Codes (eventuell mittels eines besseren Algorithmus oder durch effizientere Programmierweise) einiges an Beschleunigung herausholen. Sollte dies jedoch noch nicht ausreichen, so hat man einige Möglichkeiten, auf schnellere Sprachen zurückzugreifen. Der betroffene Code kann entweder in C oder C++ neu geschrieben werden, jedoch müssen danach Python-bindings mittels SWIG erstellt werden. Eine oft einfachere Alternative ist die Verwendung von Cython. CythonCython ist eine eigene Programmiersprache, die einen großen Teil der Flexibilität von Python mit der Performance von C kombiniert. Genaugenommen handelt es sich dabei um einen C Code-Generator, der sich auch automatisch um die Erstellung von Python Bindings kümmert. Zuerst sollten die notwendigen Pakete installiert werden. sudo aptitude install cython python-dev Danach besteht der erste Schritt wie erwähnt in der Verwendung eines
Profilers, um herauszufinden, welche Funktionen kritisch für
die Performance sind. Diese können gegebenenfalls zuerst in reinem
Python zu überarbeiten. Nun ist zu entscheiden, ob man ganze
Dateien mittels Cython optimieren will oder lediglich einzelne
Funktionen. Im ersten Fall müssen die Datei lediglich
auf cython -a yourfile.pyx Dies generiert cython yourfile.pyx gcc -c -fPIC -I/usr/include/python2.7/ -O3 yourfile.c gcc -shared i6_ctypes.o -O3 -o yourfile.so Um einiges einfacher und plattformunabhängiger ist die Verwendung
eines Python Setup Scripts. Dieses ist im Verzeichnis
der from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [Extension("yourfile", ["yourfile.pyx"]), ] setup( cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules, ) Nachdem alle python setup.py build_ext --inplace durchgeführt werden. Insgesamt ist bei geeigneten Funktionen mit Performancesteigerung um mehr als das 100-fache zu rechnen. LinksHier folgt eine (unsortierte) Aufstellung einiger der im Kurs gezeigten Webseiten mit Quellen zu Python generell und einigen interessanten Modulen. Diese Webseiten sind ein sehr guter Startpunkt fuer Informationen. Mit den enthaltenen Ressourcen sollte sich beinahe jedes Python Problem lösen lassen. Wenn sie aber nicht ausreichen sollten, so empfehle ich neben einer Recherche mit einer Suchmaschine, sich Newsgroups und SIGs zum Thema anzusehen. Weiters empfiehlt es sich, mindestens ein gutes Lehrbuch und/oder eine Referenz on- oder offline zur Verfügung zu haben. Wenn dennoch alle Stricke reissen gilt: vielleicht sollte man doch einen Menschen fragen ;). Viel Spass beim Coden in Python!
Copyright © 2009-2023 Gerald Senarclens de Grancy Haftungsausschluss: Da ich keinerlei Einfluss auf den Inhalt der Seiten, zu denen ich von meiner Homepage linke, habe, übernehme ich auch keinerlei Haftung für diese Seiten. |