Ich verwende derzeit das Buch 'Programmieren in D' zum Lernen von D. Ich habe versucht, ein Problem der Aufsummierung der Quadrate von Zahlen von 1 bis 10000000 zu lösen. Ich habe zuerst einen funktionalen Ansatz zur Lösung des Problems gemacht die Karte und reduzieren, aber wenn die Zahlen größer werden, muss ich die Zahlen in bigint umwandeln, um die richtige Ausgabe zu erhalten.Optimierung von Bigint-Aufrufen
Die oben genannten dauert 7s zu beenden, wenn mit dmd -O kompiliert. Ich profilierte das Programm und die meiste Zeit wird für BigInt Anrufe verschwendet. Obwohl das Quadrat der Zahl in eine lange passen kann, muss ich sie in bigint umwandeln, so dass Funktionssummen reduziert werden und die entsprechende Summe zurückgegeben wird. Das Python-Programm benötigt nur 3 Sekunden, um es zu beenden. Wenn num = 100000000 D ist, wird das Programm auf 1 Minute und 13 Sekunden beendet. Gibt es eine Möglichkeit, die Aufrufe von bigint zu optimieren? Die Produkte können selbst lang sein, aber sie müssen als Bigint-Objekte typisiert werden, damit sie die richtigen Ergebnisse durch Reduzieren von Operationen erhalten. Ich habe versucht, das Quadrat der Zahlen in ein bigint Array zu schieben, aber es ist auch langsamer. Ich habe versucht, alle Zahlen wie Bigint
auto bigs_map_nums = iota(1,num).map!(a => to!BigInt(a)).array;
auto bigs_map = sum(bigs_map_nums.map!(a => (a * a)).array);
Typcasting einzugeben. Aber es ist auch langsamer. Ich habe die Antworten unter How to optimize this short factorial function in scala? (Creating 50000 BigInts) gelesen. Ist es ein Problem mit der Implementierung der Multiplikation für größere ganze Zahlen in D zu? Gibt es eine Möglichkeit, die Funktionsaufrufe für BigInt zu optimieren?
Python Code:
timeit.timeit('print sum(map(lambda num : num * num, range(1,10000000)))',number=1)
333333283333335000000
3.58552622795105
Der Code auf einem Dual-Core 64-Bit-Linux Laptop mit 2 GB RAM durchgeführt wurde. python: 2.7.4 dmd: DMD64 D Compiler v2.066.1
Danke. Könntest du bitte erklären, warum du BigInt (0) in Summe benutzt und reduziert hast? Wie wird der Prozess nur bei Bedarf auf BigInt umgestellt? – xtreak
Vielen Dank. Es hat die Programme ungefähr 7-mal schneller und schneller gemacht als Python :) Es wird sehr hilfreich sein, wenn Sie die Magie erklären könnten, die Sie dort sowohl mit reduzieren als auch warum Sie umgekehrte Argumente verwendet haben. Die Summenversion sieht auch sehr elegant aus .. :) bitte fügen Sie etwas mehr Detail hinzu, da ich Neuling zu D bin. Aber in Profiler kann ich bigint Anrufe sehen. Wie ist das schneller? – xtreak