[python-users] Performance-Optimierung einiger Berechnungen
M.-A. Lemburg
mal at egenix.com
Di Dez 3 10:45:46 CET 2013
Hallo Marian,
On 03.12.2013 10:10, marian wrote:
> 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).
Da das Skript hauptsächlich direkt mit Floats arbeitet, solltest
Du hier mit Cython recht weit kommen:
http://cython.org/
Das erzeugt dann aus dem Code eine Python C Extension, die Du ins Programm
einbinden kannst.
Alternativ würde ich die Berechnungen einfach direkt in C programmieren
und dann als Python C Extension einbinden. Das macht allerdings erst dann
Sinn, wenn Du Dir sicher bist, daß sich an den Berechnungen nicht mehr
viel ändert.
> 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
--
Marc-Andre Lemburg
eGenix.com
Professional Python Services directly from the Source (#1, Dec 03 2013)
>>> Python Projects, Consulting and Support ... http://www.egenix.com/
>>> mxODBC.Zope/Plone.Database.Adapter ... http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
________________________________________________________________________
::::: Try our mxODBC.Connect Python Database Interface for free ! ::::::
eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48
D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
Registered at Amtsgericht Duesseldorf: HRB 46611
http://www.egenix.com/company/contact/
Mehr Informationen über die Mailingliste python-users