Ich muss eine optimale Auswahl von Medien, basierend auf bestimmten Einschränkungen herausfinden. Ich mache es in FOUR geschachtelt für Schleife und da es etwa O (n^4) Iterationen dauern würde, ist es langsam. Ich hatte versucht, es schneller zu machen, aber es ist immer noch verdammt langsam. Meine Variablen können so hoch wie ein paar Tausend sein.Python: langsam verschachtelt für Schleife
Hier ist ein kleines Beispiel dafür, was ich zu tun versucht:
max_disks = 5
max_ssds = 5
max_tapes = 1
max_BR = 1
allocations = []
for i in range(max_disks):
for j in range(max_ssds):
for k in range(max_tapes):
for l in range(max_BR):
allocations.append((i,j,k,l)) # this is just for example. In actual program, I do processing here, like checking for bandwidth and cost constraints, and choosing the allocation based on that.
Es ist nicht für bis zu Hunderten von einzelnen Medientypen langsam war, aber würde für Tausende verlangsamen.
Andere Art und Weise habe ich versucht, ist:
max_disks = 5
max_ssds = 5
max_tapes = 1
max_BR = 1
allocations = [(i,j,k,l) for i in range(max_disks) for j in range(max_ssds) for k in range(max_tapes) for l in range(max_BR)]
diese Weise ist es langsam auch für solche kleinen Zahlen.
Zwei Fragen:
- Warum die zweite für kleine Zahlen langsam ist?
- Wie kann ich mein Programm für große Zahlen (in Tausend) arbeiten lassen? Hier
ist die Version mit itertools.product
max_disks = 500
max_ssds = 100
max_tapes = 100
max_BR = 100
# allocations = []
for i, j, k,l in itertools.product(range(max_disks),range(max_ssds),range(max_tapes),range(max_BR)):
pass
Es dauert 19,8 Sekunden mit diesen Zahlen zu beenden.
Das erste Beispiel mit einem Listenverständnis ist * schneller * als das zweite Beispiel. Sie sind ansonsten äquivalent, aber die Attributsuche 'allocations.append' und der nachfolgende Methodenaufruf verlangsamen die verschachtelte Schleife. Wahrscheinlich möchten Sie stattdessen "itertools.product()" hier betrachten und es vermeiden, ein riesiges Listenobjekt mit allen möglichen Kombinationen zu erstellen (bearbeiten Sie die Elemente stattdessen einzeln). –
Ich habe itertools.product() auch versucht. Aber das hat auch nicht für Tausende funktioniert. – Pretty
Bestehen Sie darauf, eine Liste der Zuordnungen zu erstellen? Sie kennen bereits die allgemeine Struktur der von Ihnen erstellten Liste. Können Sie die Zuordnungen nicht einzeln verarbeiten? –