[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