Wie berechnet man eine teure hochpräzise Summe in Python?

8

Mein Problem ist sehr einfach. Ich möchte die folgende Summe berechnen.

%Vor%

Allerdings gibt Python RuntimeWarning: overflow encountered in multiply und nan als Ausgabe und es ist auch sehr, sehr langsam.

Gibt es dafür einen cleveren Weg?

    
Anush 03.02.2014, 18:50
quelle

2 Antworten

15

Der Grund, warum Sie NaNs bekommen, ist, dass Sie am Ende Zahlen wie

auswerten %Vor%

Dies ist zu groß, um in eine Gleitkommazahl zu passen:

%Vor%

Logarithmen nehmen, um es zu vermeiden:

%Vor%     
pv. 03.02.2014, 19:39
quelle
1

Verwenden Sie das Muster Memoize . Mit diesem neu definieren Kamm:

%Vor%

Und ersetzen Sie alle Aufrufe von comb durch newcomb . Entfernen Sie für eine kleine Verbesserung auch die Klammern. Wenn Sie explizite Listen erstellen, verschwenden Sie Zeit mit deren Erstellung. Wenn Sie sie entfernen, verwenden Sie effektiv Generatorausdrücke .

Aktualisieren :

Dies wird das nan Problem nicht lösen, macht es aber viel schneller.

Für alle, die das nicht als schneller sehen, wenden Sie den memoize Dekorateur an? Auf meinem Rechner benötigt die ursprüngliche Funktion 29,7 Sekunden, um bis zu 200 zu erreichen, aber nur 3,8 mit der Version mit Memo.

Was memoize tut, speichert einfach alle Ihre Aufrufe von comb in einer Nachschlagetabelle. Wenn Sie also in einer späteren Iteration comb mit den gleichen Argumenten wie zu einem bestimmten Zeitpunkt in der Vergangenheit aufrufen, wird sie nicht neu berechnet - sie wird einfach in der Nachschlagetabelle nachgeschlagen.

    
user1462309 03.02.2014 19:26
quelle

Tags und Links