»Premature optimization is the root of all evil« – Donald E. Knuth
23 Optimierung
Als Programmierer sollten Sie mit der Zeit einen gewissen Sinn für die Ästhetik und Eleganz eines Programms entwickeln, der Ihnen sagt, wann Ihr Programm »schön« ist. Zwei wichtige Punkte eines eleganten Programms sind die Einfachheit des Ansatzes und die Laufzeiteffizienz. Diese beiden Grundsätze stehen sich in gewissem Maße gegenüber, denn häufig ist der effizienteste Ansatz nicht gerade von Klarheit geprägt.
Aus diesem Grund ist es bei einem nicht-zeitkritischen Programm absolut legitim, Effizienz und Einfachheit gegeneinander abzuwägen und zu einem gesunden Kompromiss zu gelangen. Bei einem zeitkritischen Programm ist die beste Lösung hingegen immer die effizienteste. Wir werden uns in diesem Kapitel ausschließlich mit der Optimierung der Laufzeit eines Python-Programms beschäftigen. Beachten Sie, dass ein Programm abgesehen von der Laufzeit noch in Hinblick auf andere Bereiche optimiert werden kann. So ist es beispielsweise durchaus üblich, eine Speicherplatzoptimierung durchzuführen, und letztendlich kann ein Programm auch in Hinblick auf die Einfachheit und Klarheit des Quelltextes hin optimiert werden. Der Begriff »Optimierung« wird im Folgenden ausschließlich im Sinne von »Laufzeitoptimierung« verstanden.
Egal, welche Art von Programm Sie schreiben oder welchen Begriff von Eleganz Sie haben, es lohnt sich auf jeden Fall, einen Blick auf einige Optimierungsstrategien von Python-Programmen zu werfen. Viele der hier gezeigten Tipps sind sehr simpel und lassen sich problemlos zur Gewohnheit machen.
Beachten Sie, dass wir uns dabei rein auf Python-spezifische Optimierungsstrategien konzentrieren. Den höchsten Laufzeitgewinn erzielen Sie jedoch mit der Optimierung der Algorithmik selbst. Doch das Optimieren von Algorithmen ist ein Thema für sich und soll hier keine Erwähnung finden. Beachten Sie zudem, dass wir häufig kleinere Python-Codes einander gegenüberstellen werden, die den gleichen Effekt haben, sich jedoch teils gravierend in ihrer Laufzeit unterscheiden. Die in diesem Zusammenhang als »falsch« dargestellte Alternative ist natürlich nicht tatsächlich falsch, sondern im Vergleich zur anderen Variante nur ineffizient. Dennoch führen beide Alternativen zum gesteckten Ziel, sodass Sie frei entscheiden können, welcher der Varianten Sie den Vorzug gewähren möchten.
23.1 Die Optimize-Option 

Grundsätzlich können Sie das Laufzeitverhalten eines Python-Programms beeinflussen, indem Sie es mit der Kommandozeilenoption -O ausführen. Diese Option veranlasst den Interpreter dazu, den resultierenden Byte-Code zu optimieren. Das bedeutet, dass assert-Anweisungen und Konstrukte wie
if __debug__: mache_etwas()
nicht ins Kompilat aufgenommen werden und somit keinen Einfluss auf das Laufzeitverhalten des optimierten Programms mehr haben können. Der optimierte Byte-Code wird in Dateien mit der Dateiendung .pyo gespeichert.
Durch die Kommandozeilenoption -OO ist es möglich, das Programm über das normale Maß hinaus zu optimieren. Wenn dies gewünscht ist, werden alle im Quelltext enthaltenen Docstrings ignoriert und nicht mit in das Kompilat aufgenommen. Auch damit wird ein wenig mehr Laufzeiteffizienz erreicht, wenngleich sich der Gewinn in Grenzen halten sollte. Beachten Sie dann aber, dass Sie keine Docstrings mehr auslesen können, weil keine vorhanden sind. Es ist dann beispielsweise für die Built-in Function help nicht mehr möglich, eine Hilfeseite zu Elementen Ihres Moduls zu generieren.




bestellen





