Python 类 的性能影响:科学计算
Performance impact of Python classes: Scientific Computing
所以我正在编写粒子模型。该模拟将涉及创建许多具有属性的粒子,例如物种索引(以识别粒子类型)和 3D position/velocity space。它还将具有基于其在 space 中的位置的属性,这些属性将在模拟 运行 期间计算。我以前 运行 使用一个巨大的 numpy 数组来构建这个模型,其中每一行对应一个粒子,每一列对应一个粒子属性。
我的主要问题是:如果我要创建一个 class "Particles" 以便我可以生成代表每个粒子的实例,在计算速度方面是否会影响性能?如果我想 运行 一个包含一百万个粒子的程序,将所有数字放在一个大数组中是否更有效(即使它不太可读),或者使用它的实例是否同样有效class,并随着模拟的进行修改实例属性?还是 classes 很好,但是在 Python list/NumPy 数组中存储那么多 class 实例真的会减慢执行速度?
顺便说一句,该程序将与 python 模块 "Numba" 一起使用,该模块对数值计算进行了大量优化(特别是通过 jitclass http://numba.pydata.org/numba-doc/latest/user/jitclass.html#numba.jitclass).但是,我不想通过在我的模拟中声明导致它 运行 效率低下的变量来破坏这个模块的性能优势。
谢谢!
I've previously been running this models using a giant numpy array
听起来不错。
If I was to create a class "Particles" so that I could generate instances representing each particle, is there a performance hit in terms of computational speed?
可能会慢很多。
您现有的 NumPy 数组解决方案可让您在一个大数组中表示所有粒子:
id species x y z dx dy dz
id species x y z dx dy dz
id species x y z dx dy dz
如果您将其更改为每个粒子使用 class 个实例,您仍然可以将它们保存在 NumPy 数组(或列表)中,但它看起来像这样:
object -> [id species x y z dx dy dz]
object -> [id species x y z dx dy dz]
object -> [id species x y z dx dy dz]
这是您需要分配的 4 个 N+1 对象,而不是 1 个(数组)。
我会坚持最初的设计,即巨大的 NumPy 数组,除非它会导致重大问题。
你应该在这里使用结构化数据类型:
particle_dtype = np.dtype([
('id', int),
('species', (np.unicode_, 16)),
('pos', np.float32, 3),
('vel', np.float32, 3)
])
particles = np.empty(100, dtype=particle_dtype)
particles[0]['id'] = 1
particles['pos'] += particles['vel'] * dt
所以我正在编写粒子模型。该模拟将涉及创建许多具有属性的粒子,例如物种索引(以识别粒子类型)和 3D position/velocity space。它还将具有基于其在 space 中的位置的属性,这些属性将在模拟 运行 期间计算。我以前 运行 使用一个巨大的 numpy 数组来构建这个模型,其中每一行对应一个粒子,每一列对应一个粒子属性。
我的主要问题是:如果我要创建一个 class "Particles" 以便我可以生成代表每个粒子的实例,在计算速度方面是否会影响性能?如果我想 运行 一个包含一百万个粒子的程序,将所有数字放在一个大数组中是否更有效(即使它不太可读),或者使用它的实例是否同样有效class,并随着模拟的进行修改实例属性?还是 classes 很好,但是在 Python list/NumPy 数组中存储那么多 class 实例真的会减慢执行速度?
顺便说一句,该程序将与 python 模块 "Numba" 一起使用,该模块对数值计算进行了大量优化(特别是通过 jitclass http://numba.pydata.org/numba-doc/latest/user/jitclass.html#numba.jitclass).但是,我不想通过在我的模拟中声明导致它 运行 效率低下的变量来破坏这个模块的性能优势。
谢谢!
I've previously been running this models using a giant numpy array
听起来不错。
If I was to create a class "Particles" so that I could generate instances representing each particle, is there a performance hit in terms of computational speed?
可能会慢很多。
您现有的 NumPy 数组解决方案可让您在一个大数组中表示所有粒子:
id species x y z dx dy dz
id species x y z dx dy dz
id species x y z dx dy dz
如果您将其更改为每个粒子使用 class 个实例,您仍然可以将它们保存在 NumPy 数组(或列表)中,但它看起来像这样:
object -> [id species x y z dx dy dz]
object -> [id species x y z dx dy dz]
object -> [id species x y z dx dy dz]
这是您需要分配的 4 个 N+1 对象,而不是 1 个(数组)。
我会坚持最初的设计,即巨大的 NumPy 数组,除非它会导致重大问题。
你应该在这里使用结构化数据类型:
particle_dtype = np.dtype([
('id', int),
('species', (np.unicode_, 16)),
('pos', np.float32, 3),
('vel', np.float32, 3)
])
particles = np.empty(100, dtype=particle_dtype)
particles[0]['id'] = 1
particles['pos'] += particles['vel'] * dt