Respuesta simple: en python moderno, cada tipo de datos es una clase, por lo que formalmente no hay diferencia entre las dos soluciones que propuso. (Recuerde utilizar clases de estilo nuevo: ¡las clases clásicas son obsoletas! Consulte http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes )
Ahora la pregunta debería ser: ¿cómo organizo una estructura de datos eficiente en python? No hay duda de que la idea misma de organizar las células como un conjunto de class Cell
instancias es demasiado ineficiente. Terminará con un desorden de punteros y datos no relacionados con usted organizados como una lista enlazada complicada. Por supuesto, tiene la capacidad de insertar fácilmente nuevas celdas en su lista: pero ¿necesita esta función? Por el contrario, tendrá un almacenamiento de datos no contiguo y tendrá que acceder a cada celda mediante diferentes niveles de indirección.
Si organiza sus datos como datos, numpy.ndarray
entonces los datos son contiguos a la memoria, y el acceso a diferentes celdas simplemente se hace caminando a través de su bloque de memoria: espacio eficiente (no se desperdicia memoria para los punteros) y rápido .
Como señaló Ethan, los conceptos de OO deben usarse, pero a un nivel más alto, una vez que se ha implementado una estructura de datos eficiente de bajo nivel, generalmente a través numpy.ndarray
de los.
La programación OO significa vincular datos a los métodos que operan en los datos mismos en un nivel más alto de abstracción. (Un ejemplo: implementé un código FEM en el que la matriz de rigidez se definió como una clase con un método para la factorización colesky súper nodal dispersa. La primera implementación fue en el núcleo: cuando se necesitaba una implementación fuera del núcleo, esto se obtuvo mediante herencia y ajustes mínimos en el almacenamiento de datos subyacentes. Se reutilizó casi el 100% del código colesky súper nodal).
Un último comentario, pero crucial: un procedimiento numérico eficiente es el resultado de un mapeo inteligente de un algoritmo y una estructura de datos a su arquitectura de computación objetivo. Si comienza con una estructura de datos incorrecta, no hay forma de recuperar la eficiencia, sin una reescritura completa.