Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
@plotxy: warum die while-Schleife? Wenn Du feste Grenzen hast, dann nimm doch for.
Wenn Du Dateien mit 'w' öffnest, werden die automatisch auf 0 Bytes gestaucht, ein truncate ist überflüssig. Öffne Dateien mit dem with-Statement.
Hab mpmath noch nie benutzt, sieht aber ziemlich unpythonisch aus und scheint auch noch lahm zu sein, wenn Du tatsächlich mit dem Code mehr als 15 Minuten Rechenzeit hast, weil ich die mit dem quasi gleichen Algorithmus erreicht habe.
Zum Berechnen der Genauigkeit hilft Dir vielleicht der 10er Logarithmus.
@plotxy: ``f.truncate()`` ist überflüssig. Dateien sollte man zusammen mit der ``with``-Anweisung öffnen. Die ``while``-Schleife sollte wohl eigentlich eine ``for``-Schleife sein.
Namen sollte man erst definieren wenn man sie auch braucht und nicht alle am Anfang. Das `i` hatte mich zum Beispiel erst ein wenig verwirrt weil das erst sehr viel weiter unten auch tatsächlich verwendet wird.
`test` ist kein guter Namen für den Wert.
Funktionen machen den Quelltext nicht nur übersichtlicher sondern auch geringfügig schneller weil lokale Namen schneller aufgelöst werden als welche auf Modulebene.
Muss man `mpmath` tatsächlich als Funktionen verwenden? Sind das keine eigenen Typen mit überladenen Operatoren? Ich würde wahrscheinlich auch deutlich mehr mit Generatoren arbeiten.
Die Klammern um den Wert bei `zeit2` sind überflüssig. Die Zuweisung von 0 an `eulerdiv` ebenfalls, sowie die erste Zuweisung an `zeit2` die überhaupt nicht verwendet wird. Ausserdem sollte das wohl `eulerdiff` heissen!?
Eventuell gibt es eine schnellere Methode um an die Zehnerpotenz zu kommen als die Zahl tatsächlich wiederholt mit 10 zu multiplizieren!?
Ich würde mal behaupten, dass das einfach viel zu viele Divisionen sind. Dadurch verlierst du die ganze Performance von Integern. Hier mal mein Ansatz:
Ich habe mal deinen Ansatz genommen und ein wenig umgeschrieben. Er schaffte es in 8 sec stat 42.
also lag es bei mir wirklich am zu komplizierten code. Danke für die hilfe.
@EyDu gibt es eine möglichkeit numerator und denuminator parallel auszurechnen und dann anschließend zu subtrahieren ?
somit würde man nur die hälfte der rechenzeit brauchen.
Ja, du könntest das multiprocessing-Modul verwenden. Damit wird es noch etwas schneller. Es werden bei mir aus fast genau vier Minuten knapp unter drei. Allerdings solltest du mal genauer nachschauen, was nun tatsächlich welchen Anteil an Zeit frisst. Das umwandeln in Decimal und die Division machen sicher einen riesen Batzen aus.
Meine Variante, die gleich von großen Zahlen nach kleinen rechnet, spart sich die zweite Multiplikation gleich. Aber einen großen Teil der Zeit verschlingt die abschließende Division.
@EyDu wenn ich den prozess starte passiert nichts. der prozess ist zwar unter taksmaneger zu finden. Doch nur mit einer auslastung von max 00.03. woran liegt das ? bei meinem bruder funktioniert es auch.
@plotxy: Das Modul mit dem das Programm gestartet wird muss zumindest unter Windows importiert werden können ohne das dabei irgendwas ”passiert”. Sonst funktioniert `multiprocessing` nicht. Du musst den `main()`-Aufruf also mit einem ``if __name__ == '__main__':`` schützen.
let one = Gmp.F.from_int 1
let prec = 1_000_000
let fmul = Gmp.F.mul_prec_ui ~prec
let fdiv = Gmp.F.div_prec ~prec
let fadd = Gmp.F.add_prec ~prec
let to_string = Gmp.F.to_string_base_digits ~base:10 ~digits:1000
let f () =
let x = ref one in
let euler = ref one in
for n = 1 to 205_211 do
x := fmul !x n;
euler := fadd !euler @@ fdiv one !x;
done;
print_endline @@ to_string !euler
let _ =
f ()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Sirius3 hat geschrieben:@Leonidas: warum gehst Du nur bis 20000! ?
Versehen, hab das von hier übernommen und eine Null übersehen. In dem Fall ist die Performance noch viel schlimmer, was ja eigentlich gar nicht sein kann. Frag mich ob das Gmp-Binding so unterirdisch ist oder mein Code. Vielleicht mal Profiler anwerfen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ich tippe mal auf deinen Code Die Berechnung mit Floats sollte eine Ecke langsamer sein als mit Integern und die ganzen rechenintensiven Divisionen ziehen das ganze wahrscheinlich so richtig runter. Es reicht eine Division ganz am Ende. Hinzu kommt dann noch das Problem der Genauigkeit. Du rechnest zwar mit einer Millionen Stellen Genauigkeit pro Operation, das garantiert aber keine korrekten eine Millionen Stellen im Endergebnis.