Resposta simples: no python moderno, todo tipo de dados é uma classe; portanto, formalmente, não há diferença entre as duas soluções que você propôs. (Lembre-se de usar classes de novo estilo: classes clássicas são obsoletas! Consulte http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes )
Agora, a pergunta deve ser: como organizo uma estrutura de dados eficiente em python? Não há dúvida de que a própria idéia de organizar as células como uma matriz de class Cell
instâncias é muito ineficiente. Você terminará com uma bagunça de ponteiros e dados não contíguos organizados como uma lista vinculada complicada. Obviamente, você tem a capacidade de inserir facilmente novas células na sua lista: mas você precisa desse recurso? Pelo contrário, você terá armazenamento de dados não contíguo e precisará acessar todas as células por diferentes níveis de indireção.
Se você organizar seus dados como dados, numpy.ndarray
então os dados são contíguos à memória, e o acesso a células diferentes é simplesmente feito através do seu bloco de memória: economia de espaço (sem perda de memória para ponteiros) e rápido .
Conforme apontado por Ethan, os conceitos de OO devem ser usados, mas em nível superior, uma vez que uma estrutura de dados de baixo nível eficiente seja implementada, geralmente através de numpy.ndarray
's.
Programação OO significa vincular dados aos métodos que operam nos próprios dados em um nível mais alto de abstração. (Um exemplo: eu implementei um código FEM no qual a matriz de rigidez foi definida como uma classe com um método para fatoração esparsa super nodal de cholesky. A primeira implementação foi dentro do núcleo: quando uma implementação fora do núcleo era necessária foi obtido por herança e por ajustes mínimos no armazenamento de dados subjacentes. Quase 100% do código cholesky super nodal foi reutilizado.)
Um último comentário, mas crucial: um procedimento numérico eficiente é o resultado de um mapeamento inteligente de um algoritmo e uma estrutura de dados para sua arquitetura de computação de destino. Se você começar com a estrutura de dados incorreta, não há como recuperar a eficiência, sem uma reescrita completa.