Answers:
简单的答案:在现代python中,每种数据类型都是一个类,因此,在您提出的两种解决方案之间,形式上没有区别。(请记住使用新型类:经典类已过时!请参见http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes)
现在的问题应该是:如何在python中组织有效的数据结构?毫无疑问的是组织细胞作为阵列的想法class Cell
实例是太低效。最终,您将得到一堆混乱的指针和不连续的数据,就像复杂的链表一样。您当然可以轻松地在列表中插入新单元格:但是您需要此功能吗?相反,您将拥有不连续的数据存储,并且必须通过不同级别的间接访问每个单元。
如果您将数据组织为,numpy.ndarray
则数据是内存连续的,访问不同的单元格只是简单地跨越内存块:空间高效(指针不浪费内存)且速度很快。
正如Ethan所指出的,应该使用OO概念,但是在更高级别上,一旦实现了有效的低级别数据结构(通常通过numpy.ndarray
)即可。
OO编程意味着将数据绑定到在更高抽象层上对数据本身进行操作的方法。(示例:我实现了FEM代码,其中使用一种稀疏超节点cholesky分解方法将刚度矩阵定义为一类。第一种实现是内核内:当需要内核外实现时,是通过继承和对底层数据存储的最小调整而获得的。几乎100%的超节点cholesky代码都得到了重用。)
最后但至关重要的一点是:有效的数值过程是算法和数据结构与目标计算体系结构智能映射的结果。如果您从错误的数据结构开始,那么没有完整的重写就无法恢复效率。
我几天前也在考虑这一点(同样在Python中)。我个人并不认为面向对象的编程总是适合数字编程。设计类可能会分散您的注意力,而不仅仅是求解方程式。我更喜欢简单的函数,使用numpy可以将方程矢量化,因此所需的行数很少。Numpy非常快,因为实际的计算是使用C(或FORTRAN?)后端完成的。
我会建议你做的
主要信息是,除非您已经以最简单的方式解决了问题,否则不要开始编写类。只有通过获得解决问题的经验,您才能知道如何定义面向对象的接口。如果您事先进行此操作,则很可能会遇到麻烦。