数组大小如何影响numpy矩阵操作执行时间和CPU使用率

时间:2018-05-23 16:40:34

标签: python numpy

我的问题是关于以下代码:

%%time
import numpy as np
n_elems = 95
n_repeats = 100000
for i in range(n_repeats):
    X = np.random.rand(n_elems, n_elems)
    y = np.random.rand(n_elems)
    _ = X.dot(y)

我在iPython(版本6.2.1)中使用Python 3.5.5和numpy版本1.14.0在8核计算机上运行。

我得到以下输出:

CPU times: user 8.93 s, sys: 439 ms, total: 9.37 s  
Wall time: 8.79 s

n_elems1之间设置95时,CPU和待机时间大致相等。此外,流程的CPU使用率(使用top看到)仅上升到100%

但是,当n_elems设置为96时,我会收到以下信息:

CPU times: user 39.4 s, sys: 1min 28s, total: 2min 8s  
Wall time: 16.2 s

现在CPU和待机时间之间存在明显差异。此外,CPU使用率接近800% 对于n_elems的较大值,观察到类似的行为。

我认为这是因为在某个数组大小时,numpy操作变为多线程 有人可以澄清一下吗? 还有一种方法可以将进程的CPU使用率限制为100%

1 个答案:

答案 0 :(得分:0)

似乎有些numpy操作(例如numpy.dot)使用可以并行执行的BLAS。

其他numpy操作(例如numpy.einsum)直接在C中实现并串行执行。

有关详细信息,请参阅why isn't numpy.mean multithreaded?

要将numpy.dot的执行限制为单个线程而不管数组大小,我必须在导入numpy之前将环境变量OMP_NUM_THREADS设置为1。

我发现以下内容很有用:
How do you stop numpy from multithreading?
Limit number of threads in numpy