问题是,基本上:在性能方面和设计方面更优选的是拥有Python类的对象列表或具有多个数值属性列表?

我正在写一些科学模拟,它涉及一个相当大的相互作用粒子系统.为简单起见,假设我们有一组球在盒子内弹跳,因此每个球都有许多数值属性,如x-y-z坐标,直径,质量,速度矢量等.如何更好地存储系统?我能想到的两个主要选择是:

用这些属性和一些方法创建一个“Ball”类,然后存储该类的对象列表,例如: G. [b1,b2,b3,… bn,…],其中每个bn我们可以访问bn.x,bn.y,bn.mass等;

为每个属性创建一个数字数组,然后对于每个第i个“球”我们可以访问它的’x’坐标为xs [i],’y’坐标为ys [i],’mass’为质量[i ] 等等;

对我来说,似乎第一个选项代表了更好的设计.第二种选择看起来有些丑陋,但在性能方面可能更好,并且可以更容易地使用numpy和scipy,我尽可能多地使用它.

我仍然不确定Python是否足够快,因此在Python中进行初始原型设计之后,可能需要用C或其他东西重写它.对于C/C++,数据表示的选择是否会有所不同?混合方法怎么样,例如Python扩展名为C?

更新:我从未预料到并行数组本身会有任何性能提升,但是在像Python Numpy(或任何使用SlowScriptingLanguage FastNativeLibrary)这样的混合环境中使用它们可能(或可能不会)让你从更慢的脚本代码中移出更多的工作并进入快速的本机库.

解决方法:

在这个例子中为每个球设置一个对象肯定是更好的设计.并行数组实际上是一种不支持正确对象的语言的解决方法.我不会在具有OO功能的语言中使用它们,除非它是一个适合函数的小案例(甚至可能不是那么)或者我已经用完所有其他优化选项并且分析器显示属性访问是罪魁祸首.这适用于Python和C的两倍,因为前者非常注重可读性和优雅.