eigentlich bin ich Java Programmierer, schreibe meine Quick&Dirty Scripte aber gerne mit Python.
Nun bin ich auf ein mathematisches Rätsel gestoßen, das 9 unbekannte Variablen in 6 Gleichungen einander in Beziehung stellt.
Die Gleichungen sehen zum Beispiel so aus: ABC+BDE=FGH, ADB-ECB=IJ .....
Ohne mir über Optimierung Gedanken zu machen habe ich dazu ein Skript geschrieben, dass das Rätsel innherhalb von 1,5Stunden lösen konnte (hat auch über 3 Milliarden durchläufe gebraucht). Da ich wie gesagt Java Entwickler bin habe ich dieses Mini-Programm mal schnell in Java Portiert (man kann ja doch nicht ganz aus seine Haut), um einen Performance vergleich zu machen, mit der Erwartung das Python wesentlich schneller arbeitet.
Überraschender Weise hat sich ein extremes Gegenteil eingestellt.
Pyhton benötigt: 1,5h
Java: unter 1min
Es geht mir weniger um die Optimierung des Programmes, sondern viel mehr um die Frage warum Python (das ich immer für schneller gehalten habe) in diesme Fall so viel langsamer ist als Java, oder bin ich einem Irrglauben unterlegen das der Geschwindigkeits-Vorteil generell bei Python liegt?
Hier die beiden Programme, die genau dasselbe tun:
Code: Alles auswählen
from datetime import datetime
print "*Start*", datetime.now()
import sys
run=0
for a in range(0,10):
print "Analyzing a=", a
for b in range(0,10):
for c in range(0,10):
for d in range(0,10):
for e in range(0,10):
for f in range (0,10):
for g in range(0,10):
for h in range(0,10):
for i in range(0,10):
for j in range(0,10):
run=run+1
#zeile 1
if ((a*100+b*10+c)+(b*100+d*10+e))==f*100+g*10+h:
#zeile 2
if ((a*100+d*10+b)-(e*100+c*10+b))==i*10+j:
#zeile3
if((g*100+c*10+e)+(e*100+a*10+c))==h*100+j*10+h:
#spalte1
if ((a*100+b*10+c)+(a*100+d*10+b))==g*100+c*10+e:
#spalte2
if ((b*100+d*10+e)-(e*100+c*10+b))==e*100+a*10+c:
#spalte3
if ((f*100+g*10+h)+(i*10+j))==h*100+j*10+h:
print "Matching "
print "a=", a
print "b=", b
print "c=", c
print "d=", d
print "e=", e
print "f=", f
print "g=", g
print "h=", h
print "i=", i
print "j=", j
print
print datetime.now()
print "Checks ", run
print "*******"
Code: Alles auswählen
System.out.println("*Start* " + format.format(new Date()));
int run = 0;
for (int a = 0; a < 10; a++) {
System.out.println("Analyzing a=" + a);
for (int b = 0; b < 10; b++) {
for (int c = 0; c < 10; c++) {
for (int d = 0; d < 10; d++) {
for (int e = 0; e < 10; e++) {
for (int f = 0; f < 10; f++) {
for (int g = 0; g < 10; g++) {
for (int h = 0; h < 10; h++) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
run++;
// #zeile 1
if ((a * 100 + b * 10 + c) + (b * 100 + d * 10 + e) == f * 100 + g * 10 + h) {
// #zeile 2
if ((a * 100 + d * 10 + b) - (e * 100 + c * 10 + b) == i * 10 + j) {
// #zeile3
if ((g * 100 + c * 10 + e) + (e * 100 + a * 10 + c) == h * 100 + j * 10 + h) {
// #spalte1
if ((a * 100 + b * 10 + c) + (a * 100 + d * 10 + b) == g * 100 + c * 10 + e) {
// #spalte2
if ((b * 100 + d * 10 + e) - (e * 100 + c * 10 + b) == e * 100 + a * 10 + c) {
// #spalte3
if ((f * 100 + g * 10 + h) + (i * 10 + j) == h * 100 + j * 10 + h) {
System.out.println("Matching ");
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
System.out.println("d=" + d);
System.out.println("e=" + e);
System.out.println("f=" + f);
System.out.println("g=" + g);
System.out.println("h=" + h);
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println();
System.out.println("*Start* " + format.format(new Date()));
System.out.println("Checks " + run);
System.out.println("*******");
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Dom