Angenommen wir haben ein 4-dimensionales Array,
dass je nach Index locker mehr als 1000 Elemente aufnehmen kann.
Momentan fülle ich die Werte aus einer Datei mit einer hässlichen 4-fach for-Schleife.
Da hab ich mir überlegt ich das nicht beschleunigen kann, indem ich aus vier
for-Schleifen eine mach. Und tatsächlich das Teil ist 2x schneller.
Hier der Beweis:
Code: Alles auswählen
#benchmark_01.py
#!/usr/bin/python -OO
2
3 for w in range(320):
4 for h in range(240):
5 for f in range(100):
6 for c in range(3):
7 pass
Code: Alles auswählen
#benchmark_02.py
#!/usr/bin/python -OO
2
3 for i in range(320*240*100*3):
4 pass
Code: Alles auswählen
#console output, zur Sicherheit 2x ausgeführt...
> time ./benchmark_01.py
real 0m13.208s
user 0m12.975s
sys 0m0.007s
> time ./benchmark_02.py
real 0m6.888s
user 0m5.415s
sys 0m0.841s
> time ./benchmark_01.py
real 0m13.725s
user 0m13.119s
sys 0m0.012s
> time ./benchmark_02.py
real 0m6.246s
user 0m5.340s
sys 0m0.828s
>
Mit der 4-fach for-Methode werden meine Daten langsam, aber in der korrekten Reihenfolge gefüllt:
array[w][h][f][c], wobei zuerst w von 0 - width komplett durchläuft, bevor die anderen laufvars angefasst werden.
Umgekehrt bei der schnellen 1-fach Methode fülle ich das Array nach dem Prinzip:
i=w*h*f*c
array[i%w][i%h][i%f][i%c]
Funktioniert auch, nur die Reihenfolge ist nicht die erwünschte.
Es hat nicht zufällig ein Mathe-genie ne Idee wie man mit einer for-Schleife alles 2x schneller machen kann UND die Reihenfolge erhällt?
Theoretisch müsste es genau eine bijektive Transformation geben, die genau das bewerkstelligt. Oder?