Risposta semplice: in Python moderno ogni tipo di dato è una classe, quindi formalmente non c'è differenza tra le due soluzioni che hai proposto. (Ricorda di usare classi di nuovo stile: le classi classiche sono obsolete! Vedi http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes )
Ora la domanda dovrebbe essere: come organizzo una struttura dati efficiente in Python? Non vi è dubbio che l'idea stessa di organizzare le cellule come una serie di class Cell
istanze sia troppo inefficiente. Ti ritroverai con un casino di puntatori e dati non contigui organizzati come un complicato elenco di link. Ovviamente hai la possibilità di inserire facilmente nuove celle nel tuo elenco: ma hai bisogno di questa funzione? Al contrario, avrai una memorizzazione dei dati non contigua e dovrai accedere a ogni cella con diversi livelli di indiretta.
Se organizzi i tuoi dati come numpy.ndarray
allora, i dati sono contigui alla memoria e l'accesso a celle diverse è semplicemente fatto avanzando attraverso il tuo blocco di memoria: spazio efficiente (nessuna memoria sprecata per i puntatori) e veloce .
Come sottolineato da Ethan, i concetti di OO dovrebbero essere usati, ma a un livello superiore, una volta implementata un'efficiente struttura di dati di basso livello, di solito attraverso quella numpy.ndarray
di.
Programmazione OO significa associare i dati ai metodi che operano sui dati stessi a un livello di astrazione più elevato. (Un esempio: ho implementato un codice FEM in cui la matrice di rigidezza è stata definita come una classe con un metodo per la fattorizzazione sparsa e super-nodale cholesky. La prima implementazione era in-core: quando era necessaria un'implementazione out-of-core, questo è stato ottenuto tramite ereditarietà e aggiustamenti minimi alla memorizzazione dei dati di sottolineatura. Quasi il 100% del codice cholesky soprannodale è stato riutilizzato.)
Un ultimo commento, ma cruciale: un'efficiente procedura numerica è il risultato di una mappatura intelligente di un algoritmo e di una struttura di dati sulla tua architettura di calcolo target. Se si inizia con una struttura di dati errata, non è possibile ripristinare l'efficienza senza una riscrittura completa.