Python类的性能影响:科学计算

2024-04-26 20:33:56 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我正在写一个粒子模型。这个模拟将涉及到创建一些具有诸如种类指数(用来识别粒子类型)和三维空间中的位置/速度等属性的粒子。它还具有基于其在模拟运行期间将计算的空间中的位置的属性。我以前用一个巨大的numpy数组运行过这个模型,其中每行对应一个粒子,每列对应一个粒子属性。你知道吗

我的主要问题是:如果我要创建一个类“Particles”,这样我就可以生成代表每个粒子的实例,那么在计算速度方面是否会对性能造成影响?如果我想运行一个有一百万个粒子的程序,是将所有的数字放在一个大数组中更有效(尽管它的可读性不太好),还是使用这个类的实例,并在模拟过程中修改实例属性同样有效?或者是类很好,但是在pythonlist/NumPy数组中存储那么多类实例确实会降低执行速度?你知道吗

另外,这个程序将与python模块“Numba”一起使用,后者对数值计算进行了大量优化(特别是通过jitclasshttp://numba.pydata.org/numba-doc/latest/user/jitclass.html#numba.jitclass)。但是,我不想因为在模拟中声明变量而破坏这个模块的性能优势,因为这些变量会导致它运行效率低下。你知道吗

谢谢!你知道吗


Tags: 模块实例模型程序类型属性粒子数组
2条回答

您应该在此处使用结构化数据类型:

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

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

如果将其更改为对每个粒子使用类实例,则仍可以将它们保留在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]

您需要分配四个N+1对象,而不是1(数组)。你知道吗

我会坚持原来的设计,巨型NumPy阵列,除非它是造成重大问题。你知道吗

相关问题 更多 >