deepcopy() ist extrem langsam

Habe ich ein Spiel state in Python mit über 1000 Objekten (planetarische Systeme + Sterne + Planeten), und ich brauche, um es zu kopieren und anwenden einer Reihe von Transformationen, wenn gewünscht. Aber bei über 1 request/Sekunde, das ist nehmen 24.63% meiner Spielzeit. Wie kann ich es machen das schnell gehen? Beachten Sie, dass das kopieren weniger ist keine option, da die Transformationen berühren Sie einfach über alles.

BEARBEITEN: habe es bis zu 8% mit klugen Umsetzung von __deepcopy__ auf die Dinge. Noch, nicht gut genug. (Gut genug ist 1% oder weniger, ich habe vor, werfen viele weitere Dinge an.) timeit sagt 41.8 ms pro deepcopy().

  • Alternativ zu dem kopieren der Staat, könnten Sie eine Aktion erstellen, queue: Verwenden Sie den aktuellen Zustand zu bestimmen, die nächsten Aktionen und Effekte für alle Objekte, ohne Sie gleich an, dann gelten all diese Aktionen in eine batch -, dann berechnen Sie die Aktionen für den nächsten 'turn', etc.
  • Das ist eigentlich genau das, was mein Haufen verwandelt tut, aber ich muss es tun, um wieder ganz oft, also das kopieren.
  • Dann verstehe ich nicht die Frage: bewerben Sie sich verschiedene Gruppen von Maßnahmen, um den gleichen Zustand. vielleicht um zu sehen, welche kommen am besten an?
  • Yup. Gut, nicht, um zu sehen, welche kommen am besten, aber das ist, was ich Tue.
  • Andere Idee: Vielleicht kann man eine Art "diff-state", also wie "dieses ist x und y und alles andere ist das gleiche wie im übergeordneten Zustand z".
  • Ja, aber Zugriff auf die Ausgabe-ohne änderung an den ursprünglichen Zustand, ich brauche immer noch eine Kopie.
  • Aber würden Sie nicht brauchen, um zu kopieren Sie den gesamten Staat, wenn diese Aktionen ändern sich nur, sagen wir, 10% von ihm. Legen Sie fest, was diese 10% werden in die "Kopie" des Staates und halten einen Verweis zurück auf den ursprünglichen Zustand, für die restlichen 90%.
  • Warum nicht 'kopieren ()', die eine flache Kopie ? Ich sehe nicht den Punkt, wo Sie brauchen eine deepcopy().
  • Das funktioniert vielleicht, aber es wäre eine Menge Arbeit zu pflegen die internen Verweise.
  • Ich muss eine Tiefe Kopie, da der Staat Objekt hat Objekte, die ich brauche Kopien.

InformationsquelleAutor Electro | 2014-07-15
Schreibe einen Kommentar