在Python中提高数组的循环速度

        搜索了一个晚上加半个下午的时间,终于将这段代码优化了,这里记录下整个搜索结果,便于以后翻看记录

原来的代码如下:

这里值亮出最耗时的四个代码部分:

1.这里aa是一个大于10000的数字

  for i in range(0, aa):
        t[i] = (xyz[i][0] * A + xyz[i][1] * B + xyz[i][2] * C) / (A * A + B * B + C * C)

2.这里是python自带的max和min,在后面才发现,这个代码也非常耗时

  tmax = max(t)
  tmin = min(t)

3.

  for i in range(0, aa):
        if t[i] > (tmax - tmin) * 2 / 4 + tmin:
            delcount+=1
            xyz[i][0] = 0
            xyz[i][1] = 0
            xyz[i][2] = 0

4.将所有为0的数字删除

    xyz = xyz[[not np.all(xyz[i] == 0) for i in range(xyz.shape[0])], :]

        aa为大于10000的数字,这段代码在电脑上运行的时间总共为0.15s,在jetson nano上面运行的时间为1.5s,相当的慢,因此需要对其进行优化。

        经过短暂的搜索,发现了一个叫做numba的函数库,但是经过尝试吗,我将它否决了,原因如下:

1.虽然numba在循环遍历的优势很大,但numba在运行过程中需要预编译,这个过程将会花费大量的时间,所以它所消耗的时间,比原版的代码还要慢。

2.我估计在nano上面部署也很困难。

于是,我就只能将目光转向numpy,利用numpy中的矩阵运算来取代。结果如下:

1.利用矩阵运算符@

    t=xyz_load@ABC

2.用numpy的max和min

    tmax = np.max(t)
    tmin = np.min(t)

3.用np.where获得不满足条件的行下标

 delline = np.asarray(np.where(t>thres))
 delline=delline[0]
 print(delline.shape)

4.用numpy做掩膜,从而取出满足条件的行

  mask=np.ones(aa,dtype=bool)
  mask[delline] = False
  xyz=xyz[mask]

最后,优化后的代码,时间上小于0.01,达到了十分理想的优化!!!

可谓妙哉~~~~

 

你可能感兴趣的:(python,numpy,开发语言)