[python-users] Performance-Optimierung einiger Berechnungen

Christopher Arndt chris at chrisarndt.de
Do Dez 5 15:00:21 CET 2013


Am 03.12.2013 11:07, schrieb marian:
> Oh, das sieht gut aus! Von 4,9 auf 2,0 Sekunden, ohne Änderungen im Code :)
>
> Dann werde ich als nächstes mal die "Strict typing" Empfehlung aus der
> Cython Dokumentaion testen.

Ich komme mit an Cython angepassten Code von ~ 3.465 auf ~ 0.4 sec.

$ python audiocalc/benchmark_damping.py
Using Cython implementation of 'audiocalc'.
Duration: 0.400 sec
$ rm -f audiocalc/_audiocalc.so
$ python audiocalc/benchmark_damping.py
Using Python implementation of 'audiocalc'.
Duration: 3.465 sec

Dabei habe ich hauptsächlich nur folgendes gemacht:

- Typen für alle Funktionsargumente und Rückgabewerte und lokale 
Variablen deklariert (int und double)
- pow, exp, log10, log und sqrt als direkt als C-Funktionen aus math.h 
genutzt
- Ein paar float() Conversions in Typecasts geändert.
- Die Benchmarkfunktion selbst in den Cython-Code kopiert und genauso 
behandelt.

Ok, letzteres ist etwas geschummelt, aber das hat nur ca. 100 ms 
ausgemacht. Ich wollte nur mal testen, ob dort viel Zeit vertrödelt wird.

Nach einer halben Stunde Arbeit war ich schon bei ca. 0.7 sec. Die 
nächsten 1,5 Stunden waren dann nur noch Kleinigkeiten, die nicht alle 
wirklich messbaren Geschwindigkeitszuwachs gebracht haben.

Das bemerkenswerte daran ist, dass ich die Änderungen machen konnte, 
ohne den Code wirklich zu verstehen, denn ich bin auch kein C oder 
DSP-Guru. Wenn man das Prinzip verinnerlicht hat, kann man die o.g. 
Punkte auf fast jeden Code anwenden, ohne ihn im einzelnen zu 
durchblicken, wobei sich dieses Beispiel besonders eignete, weil fast 
alles in float-Berechnungnen abläuft.

Auch wenn man dann noch nicht so hohe Geschwindigkeitszuwächse hat, wie 
Dirk demonstriert hat (wobei er nicht das selbe misst, denn seine 
Benchmark-Funktion steckt im C++-Code und ist angepasst), bleiben für 
mich folgende Vorteile des Ansatzes:

1) Der Code bleibt weiterhin aus Python heraus nutzbar.
2) Mit vergleichsweise geringem Aufwand bekommt man schon ordentliche 
Geschwindigkeitssteigerung.
3) Mit nur etwas mehr Aufwand lässt sich noch mehr rausholen und die 
Geschwindigkeit ist in einem Bereich, bei dem man fragen muss, ob es 
nicht schon "schnell genug" ist.
4) Man muss dazu kaum C können.
5) Die eigentliche Implementierung wurde noch nicht einmal optimiert 
(setzt u.U. mehr C-Kenntnisse) voraus).

Das out-of-the-box Ergebnis mit pypy finde ich allerdings auch 
beeindruckend. Was wären die Möglichkeiten, dies noch zu optimieren?

Diff gegen Marians git repo 2f65bec747 ist angehängt.


Chris

-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : 0001-Add-Cython-implementation.patch.gz
Dateityp    : application/gzip
Dateigröße  : 7618 bytes
Beschreibung: nicht verfügbar
URL         : <http://lists.uni-koeln.de/pipermail/python-users/attachments/20131205/a5e72015/attachment.bin>


Mehr Informationen über die Mailingliste python-users