ind*_*joe 17 python arrays optimization numpy
为了沿n维巨大的numpy数组的轴加速np.std,np.sum等函数,建议沿最后一个轴应用.
当我这样做时,np.transpose将我要操作的轴旋转到最后一个轴.它是真的重新调整内存中的数据,还是只改变轴的寻址方式?
当我尝试使用%timeit测量时间时.它在微秒内完成了这个转置,(比复制我所拥有的(112x1024x1024)阵列所需的时间要小得多.
如果它实际上并没有重新排序内存中的数据并只改变寻址,那么当应用于新旋转的最后一个轴时,它是否仍会加速np.sum或np.std?
当我试图测量它时,我似乎加快了速度.但我不明白怎么做.
它似乎并没有真正加速转置.最快的轴是C顺序时的最后一个轴,当它是Fortran排序时的第一个轴.因此,在应用np.sum或np.std之前进行转置是没有意义的.对于我的特定代码,我通过在数组创建期间给出order ='FORTRAN'来解决问题.这使第一轴最快.
感谢所有的答案.
为了详细说明拉尔斯曼的答案,以下是一些时间安排:
# normal C (row-major) order array
>>> %%timeit a = np.random.randn(500, 400)
>>> np.sum(a, axis=1)
1000 loops, best of 3: 272 us per loop
# transposing and summing along the first axis makes no real difference
# to performance
>>> %%timeit a = np.random.randn(500, 400)
>>> np.sum(a.T, axis=0)
1000 loops, best of 3: 269 us per loop
# however, converting to Fortran (column-major) order does improve speed...
>>> %%timeit a = np.asfortranarray(np.random.randn(500,400))
>>> np.sum(a, axis=1)
10000 loops, best of 3: 114 us per loop
# ... but only if you don't count the conversion in the timed operations
>>> %%timeit a = np.random.randn(500, 400)
>>> np.sum(np.asfortranarray(a), axis=1)
1000 loops, best of 3: 599 us per loop
Run Code Online (Sandbox Code Playgroud)
总而言之,如果您要对列进行大量操作,则将数组转换为Fortran顺序可能是有意义的,但是转换本身是昂贵的,并且几乎可以肯定,对于单个操作而言,转换是不值得的。