Dies ist eine Fortsetzung von Wie langsam ist Python wirklich? (Oder wie schnell ist Ihre Sprache?) .
Es stellte sich heraus, dass es ein bisschen zu einfach war, für meine letzte Frage ein x100-Speedup zu bekommen. Für diejenigen, die die Herausforderung genossen haben, aber etwas Schwierigeres wollen, bei dem sie ihre geringen Fähigkeiten wirklich einsetzen können, ist hier Teil II. Die Herausforderung besteht darin, eine x100-Beschleunigung für den folgenden Python-Code zu erhalten, der auf meinem Computer getestet wurde.
Um es schwieriger zu machen, verwende ich diesmal Pypy. Das aktuelle Timing für mich ist 1 Minute und 7 Sekunden mit Pypy 2.2.1.
Regeln
- Die erste Person, die Code einreicht, den ich ausführen kann, der korrekt ist und der auf meinem Computer 100-mal schneller ist, erhält eine Prämie von 50 Punkten.
- Ich werde den Gewinn nach einer Woche an den schnellsten Code vergeben.
import itertools
import operator
import random
n = 8
m = 8
iters = 1000
# creates an array of 0s with length m
# [0, 0, 0, 0, 0, 0, 0, 0]
leadingzerocounts = [0]*m
# itertools.product creates an array of all possible combinations of the
# args passed to it.
#
# Ex:
# itertools.product("ABCD", "xy") --> Ax Ay Bx By Cx Cy Dx Dy
# itertools.product("AB", repeat=5) --> [
# ('A', 'A', 'A', 'A', 'A'),
# ('A', 'A', 'A', 'A', 'B'),
# ('A', 'A', 'A', 'B', 'A'),
# ('A', 'A', 'A', 'B', 'B'),
# etc.
# ]
for S in itertools.product([-1,1], repeat = n+m-1):
for i in xrange(iters):
F = [random.choice([-1,0,0,1]) for j in xrange(n)]
# if the array is made up of only zeros keep recreating it until
# there is at least one nonzero value.
while not any(F):
F = [random.choice([-1,0,0,1]) for j in xrange(n)]
j = 0
while (j < m and sum(map(operator.mul, F, S[j:j+n])) == 0):
leadingzerocounts[j] +=1
j += 1
print leadingzerocounts
Die Ausgabe sollte ähnlich sein
[6335185, 2526840, 1041967, 439735, 193391, 87083, 40635, 19694]
Sie müssen einen zufälligen Startwert in Ihrem Code verwenden, und jeder Zufallszahlengenerator, der gut genug ist, um Antworten in der Nähe der oben genannten zu geben, wird akzeptiert.
Mein Computer Die Timings werden auf meinem Computer ausgeführt. Dies ist eine Ubuntu-Standardinstallation auf einem AMD FX-8350 Eight-Core-Prozessor. Dies bedeutet auch, dass ich in der Lage sein muss, Ihren Code auszuführen.
Erklärung des Codes
Dieser Code durchläuft alle Arrays S der Länge n + m-1, die sich aus -1s und 1s zusammensetzen. Für jedes Array S werden 1000 von Null verschiedene zufällige Arrays F der Länge n abgetastet, die aus -1,0 oder 1 bestehen, mit einer Wahrscheinlichkeit von 1/4, 1/2, / 14, jeden Wert zu nehmen. Dann berechnet es die inneren Produkte zwischen F und jedem Fenster von S der Länge n, bis es ein inneres Produkt ungleich Null findet. Es addiert 1 zu leadingzerocounts
jeder Position, an der es ein inneres Produkt von Null gefunden hat.
Status
Perl . 2,7-fache Verlangsamung durch @tobyink. (Im Vergleich zu Pypy nicht Cpython.)
J . 39-fache Beschleunigung durch @Eelvex.
- C . 59-fache Beschleunigung durch @ace.
- Julia . 197-mal schneller, ohne Startzeit von @ one-more-minute. 8,5-fache Geschwindigkeit einschließlich Startzeit (in diesem Fall sind 4 Prozessoren schneller als 8).
- Fortran . 438-fache Beschleunigung durch @ semi-extrinsic.
- Rpython . 258-fache Beschleunigung durch @primo.
- C ++ . 508-fache Beschleunigung durch @ilmale.
(Ich habe aufgehört, die neuen Verbesserungen zeitlich festzulegen, weil sie zu schnell und die Iterationen zu klein waren.)
Es wurde darauf hingewiesen, dass Timings unter einer Sekunde unzuverlässig sind und auch einige Sprachen Startkosten verursachen. Das Argument ist, dass, wenn Sie einschließen möchten, Sie auch die Kompilierungszeit von C / C ++ usw. einschließen sollten. Hier sind die Zeiten für den schnellsten Code mit der Anzahl der Iterationen, die auf 100.000 erhöht wurden.
- Julia . 42 Sekunden von @ one-more-minute.
- C ++ . 14 Sekunden von @GuySirton.
- Fortran . 14s von @ semi-extrinsic.
- C ++ . 12s von @ilmale.
- Rpython . 18s von @primo.
- C ++ . 5s von @Stefan.
Der Gewinner ist .. Stefan!
Follow-up-Challenge veröffentlicht. Wie hoch kannst du gehen? (Eine Codierung + Algorithmen Herausforderung) . Dieser ist schwieriger.