[python-users] Performance-Optimierung einiger Berechnungen
Daniel Hepper
daniel.hepper at gmail.com
Di Dez 3 11:11:52 CET 2013
Hallo Marian,
mit PyPy bekommst du eine Performancesteigerung um Faktor 5 (in diesem Benchmark) quasi gratis, d.h. ohne Codeänderungen. Du schreibst zwar explizit dass es unter Python 2.7 laufen soll, aber vielleicht ist PyPy ja auch eine Option.
$ python -V
Python 2.7.1
$ pypy -V
Python 2.7.2 (341e1e3821fff77db3bb5cdb7a4851626298c44e, Jun 09 2012, 14:24:11)
[PyPy 1.9.0]
$ python -m audiocalc.benchmark_damping
Duration: 5.029 sec
$ pypy -m audiocalc.benchmark_damping
Duration: 0.833 sec
Viele Grüße,
Daniel
Am 03.12.2013 um 10:10 schrieb marian:
> Hallo!
>
> Ich habe hier
>
> https://github.com/marians/audiocalc/
>
> bzw. hier
>
> https://github.com/marians/audiocalc/blob/master/audiocalc/__init__.py
>
> ein paar Funktionen für die Berechnung von Schallpegeln, Luftdämpfung etc. aus verschiedenen Quellen "zusammengestückelt". Den Code nutze ich auch in einem Projekt, in dem es um Lärm-Modellierung geht. Speziell die Funktionen "distant_total_damped_rated_level" wird häufig aufgerufen und ist für einen großen Teil der Laufzeit meiner Modellberechnung verantwortlich.
>
> Gibt es hier einen Experten, der glaubt, die Laufzeit der Funktion spürbar verringern zu können? "Spürbar" sollte schon mind. 20% Beschleunigung bedeuten (wohl gemerkt auf einer CPU).
>
> Ein Benchmark-Script liegt im Repository und kann mit "python -m audiocalc.benchmark_damping" ausgeführt werden. Mit -p gibt es diese Profiling-Ausgabe (gekürzt):
>
> 8175699 function calls in 4.993 seconds
> Ordered by: standard name
>
> ncalls tottime percall cumtime percall filename:lineno(function)
> 568480 2.759 0.000 3.636 0.000 __init__.py:19(damping)
> 568480 0.902 0.000 1.092 0.000 __init__.py:73(distant_level)
> 71060 0.040 0.000 4.936 0.000 __init__.py:88(distant_total_damped_rated_level)
> 1705440 0.211 0.000 0.211 0.000 {math.exp}
> 1208020 0.207 0.000 0.207 0.000 {math.log}
> 568480 0.068 0.000 0.068 0.000 {math.sqrt}
> 71060 0.018 0.000 0.018 0.000 {method 'keys' of 'dict' objects}
> 3410880 0.731 0.000 0.731 0.000 {pow}
> 3796 0.004 0.000 0.004 0.000 {range}
>
> Wie man sieht, geht ein großer Teil der Zeit auf die Rechnung von pow(), math.log(), auch andere Grundrechenoperationen mit floats, die hier nicht aufgeführt werden, dürften eine größere Rolle spielen.
>
> Ich wäre durchaus gewillt, hierfür gegen Rechnung einen Obulus zu entrichten (1 bis 3 Stundensätze?). Wenn Du interessiert bist, melde Dich bitte vorher bei mir (Telefon, Mail oder Skype), damit wir das im Detail abstimmen können. Meine Kontaktdaten stehen unten.
>
> Ansonsten bin ich natürlich auch offen für Tipps und Ratschläge im Sinne einer User Group!
>
> Laufen soll das ganze übrigens später unter Python 2.7, Ubuntu 12 LTS auf einer Amazon EC2 c1.medium Instanz, 64bit, der audiocalc-Code sollte aber idealerweise auch auf anderen Plattformen ausführbar bleiben.
>
> Vielen Dank und Grüße
>
> Marian
>
>
> --
> Phone +49 2205 91829260
> Skype marian.steinbach
>
> ________________________________________
>
> Diese Mail erhalten Sie ueber die Mailingliste python-users der Universitaet zu Koeln
> Nachrichten an: python-users at uni-koeln.de
> Abonnement und Benutzereinstellungen: https://lists.uni-koeln.de/mailman/listinfo/python-users
> Listenarchiv: https://lists.uni-koeln.de/pipermail/python-users/
>
> pyCologne Homepage: http://pycologne.de/
Mehr Informationen über die Mailingliste python-users