Einfache Antwort: In modernem Python ist jeder Datentyp eine Klasse, sodass formal kein Unterschied zwischen den beiden von Ihnen vorgeschlagenen Lösungen besteht. (Bitte denken Sie daran, Klassen neuen Stils zu verwenden: Klassische Klassen sind veraltet! Siehe http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes )
Nun sollte die Frage lauten: Wie organisiere ich eine effiziente Datenstruktur in Python? Es besteht kein Zweifel, dass die Idee, die Zellen als Array von class Cell
Instanzen zu organisieren, viel zu ineffizient ist. Sie werden mit einem Durcheinander von Zeigern und nicht zusammenhängenden Daten enden, die wie eine komplizierte verknüpfte Liste organisiert sind. Sie haben natürlich die Möglichkeit, einfach neue Zellen in Ihre Liste einzufügen. Benötigen Sie diese Funktion? Im Gegenteil, Sie haben einen nicht zusammenhängenden Datenspeicher und müssen über verschiedene Indirektionsebenen auf jede Zelle zugreifen.
Wenn Sie Ihre Daten als organisieren, sind die Daten numpy.ndarray
speicherzusammenhängend, und der Zugriff auf verschiedene Zellen erfolgt einfach über Ihren Speicherblock: platzsparend (kein Speicher für Zeiger verschwendet) und schnell .
Wie von Ethan hervorgehoben, sollten OO-Konzepte verwendet werden, jedoch auf höherer Ebene, sobald eine effiziente Datenstruktur auf niedriger Ebene implementiert wurde, normalerweise durch numpy.ndarray
's.
OO-Programmierung bedeutet, Daten an die Methoden zu binden, die auf einer höheren Abstraktionsebene mit den Daten selbst arbeiten. (Ein Beispiel: Ich habe einen FEM-Code implementiert, in dem die Steifheitsmatrix als Klasse mit einer Methode zur spärlichen Superknoten-Cholesky-Faktorisierung definiert wurde. Die erste Implementierung war im Kern: Wenn eine Implementierung außerhalb des Kerns erforderlich war, war dies erforderlich wurde durch Vererbung und minimale Anpassungen an der unterstrichenen Datenspeicherung erhalten. Fast 100% des Superknoten-Cholesky-Codes wurden wiederverwendet.)
Ein letzter, aber entscheidender Kommentar: Ein effizientes numerisches Verfahren ist das Ergebnis einer intelligenten Zuordnung eines Algorithmus und einer Datenstruktur zu Ihrer Zielcomputerarchitektur. Wenn Sie mit der falschen Datenstruktur beginnen, gibt es keine Möglichkeit , die Effizienz wiederherzustellen, ohne sie vollständig neu zu schreiben.
Ich habe vor ein paar Tagen darüber nachgedacht (auch in Python). Persönlich denke ich nicht, dass objektorientierte Programmierung immer gut zur numerischen Programmierung passt. Sie können sich vom Entwerfen der Klassen ablenken lassen, anstatt nur die Gleichungen zu lösen. Ich bleibe lieber bei einfachen Funktionen, und mit numpy können Sie Ihre Gleichungen vektorisieren lassen, so dass nur sehr wenige Zeilen benötigt werden. Numpy ist ziemlich schnell, da die eigentlichen Berechnungen mit einem C-Backend (oder FORTRAN?) Durchgeführt werden.
Was ich Ihnen empfehlen würde,
Die Hauptbotschaft lautet: Beginnen Sie erst mit dem Schreiben von Klassen, wenn Sie das Problem bereits auf einfachste Weise gelöst haben. Nur wenn Sie Erfahrung mit der Lösung eines Problems sammeln, können Sie Ihre objektorientierte Schnittstelle definieren. Wenn Sie dies vorher tun, wird es wahrscheinlich nur stören.
quelle