[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