为何Numpy大矩阵运算效率骤降?求解性能异常原因
Numpy大规模矩阵运算的效率异常问题分析
在Numpy矩阵/向量运算中,当元素数量扩大后,运算效率出现不符合预期的异常,具体表现如下:
10_000规模的正常运算表现
当数组元素数量为10_000时,各单步运算耗时基本一致,m - m.reshape(len(m), 1)、matrix - shift、np.abs(matrix_s)的耗时均在450ms左右;合并运算np.abs(matrix - shift)的耗时约为单步运算的两倍,符合预期。
In [1]: import numpy as np In [29]: m = np.random.randn(10_000) In [30]: shift = 1.0098765 In [31]: %timeit m - m.reshape(len(m), 1) 407 ms ± 5.75 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [32]: matrix = m - m.reshape(len(m), 1) In [33]: %timeit matrix - shift 443 ms ± 6.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [34]: matrix_s = matrix - shift In [35]: %timeit np.abs(matrix_s) 455 ms ± 3.77 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [36]: %timeit np.abs(matrix - shift) 936 ms ± 89.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
20_000规模的异常运算表现
当元素数量增加到20_000时,耗时结果出现明显异常:
m - m.reshape(len(m), 1)的运算速度比后续单步运算快10倍;- 合并运算
np.abs(matrix - shift)的耗时远超过拆分运算(matrix - shift+np.abs(matrix_s))的耗时之和,两者本质是同一计算过程。
In [37]: m = np.random.randn(20_000) In [39]: %timeit m - m.reshape(len(m), 1) 1.53 s ± 47 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) In [40]: matrix = m - m.reshape(len(m), 1) In [41]: %timeit matrix - shift 18.5 s ± 5.59 s per loop (mean ± std. dev. of 7 runs, 1 loop each) In [42]: matrix_s = matrix - shift In [43]: %timeit np.abs(matrix_s) 27.3 s ± 6.65 s per loop (mean ± std. dev. of 7 runs, 1 loop each) In [44]: %timeit np.abs(matrix - shift) 1min 15s ± 4.29 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
经计算,10_000规模的矩阵约占763MB内存,20_000规模的矩阵约占3GB内存。这种效率异常是否由内存交换(swapping)问题导致?
内容的提问来源于stack exchange,提问作者Ger
相关产品推荐
相关产品推荐

