Hallo
ich habe für Minesweeper einen Algorithmus programmiert, der jede erdenkliche Möglichkeit von Minen in der näheren Umgebung konstruiert und die Realisierungen, die nicht konform mit den Bedingungen sind, streicht.
Bei sehr großen Feldern braucht der Algorithmus ca. 30 sekunden, wovon deepcopy aus dem modul copy 20 sekunden also 2/3 der zeit verschlingt. Auf das deepcopy bin ich, denke ich, angewiesen, da ich die alten "maps" kopieren muss und die neue info aus der aktuellen iteration hinzufüge...
Eine Map ist dabei als Hash/Dictionary aufgebaut, in das ich die Koordinaten als key hineingebe. Als value erhalte ich dann eine Liste mit drei Elementen, wobei alle Elemente Integer sind. Das erste bezeichnet den Zustand des Feldes (markierte Bombe, versteckt oder Zahl), das nächste die Anzahl der angrenzenden markierten Bomben und der letzte Eintrag enthält die Zahl der anliegenden versteckten Felder (schien mir lohnenswert diese zu speichern, da ich sie sehr oft brauchte)
Gibt es nun eine Möglichkeit dieses lästige deepcopy zu beschleunigen?
Wahrscheinlich, wenn ich mein Feld anders kodieren würde, anstatt ein Dictionary zu verwenden. Vielleicht einfach nur eine lineare liste, bei der ich den "Zeilenumbruch" selbst herausrechne und so meine Koordinaten (x,y) transformiere? also anstelle von dict[(x,y)] schreib ich dann list[ x+y*felderprozeile ] ?
Würde das helfen? Gibt's noch eine andere Möglichkeit?
Danke für eure Zeit und Mühe
deepcopy zu langsam?
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Dakre!Dakre hat geschrieben:Gibt es nun eine Möglichkeit dieses lästige deepcopy zu beschleunigen?
Deepcopy kannst du wahrscheinlich nicht beschleunigen. Es deckt einfach zu viele Fälle ab. Scheller bist du, wenn du auf deepcopy verzichtest.
Da du die Struktur deiner Daten kennst, kannst du ohne weiteres auf deepcopy verzichten. Laufe einfach deine alten Daten durch und erstelle für jeden Eintrag einen neuen in der "Kopie".
Eine flache Liste kannst du mit
Code: Alles auswählen
new_list = old_list[:]
Ein flaches Dictionary kannst du mit
Code: Alles auswählen
new_dict = old_dict.copy()
Siehe auch: http://www.python-forum.de/topic-5728.html
mfg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.