我的问题是关于以下代码:
%%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_elems
和1
之间设置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%
。
答案 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