首页 > 解决方案 > Numpy dot 操作完成很快但持续占用大量 CPU 时间

问题描述

这是一个计算向量和矩阵的点积的简单代码。

import numpy as np
import time

a = np.arange(2048)
b = np.random.random((2048, 24))
while True:
    starttime = time.time()
    c = a.dot(b)
    print(f'Calculated in {time.time() - starttime:.2f} seconds.')
    time.sleep(1)

上述操作的速度和预想的一样快。代码不断输出:

Calculated in 0.00 seconds.
Calculated in 0.00 seconds.
Calculated in 0.00 seconds.
...

但是,当我查看任务管理器时,我看到进程不断占用整个 CPU 内核或线程:在 6 核 12 线程 CPU 中约为 12%。似乎该指令time.sleep(1)根本不起作用。

这个问题在Ubuntu 1804和Windows 10的X86-X64平台以及Ubuntu1804的ARM平台上已经多次重现。如果我不使用numpy.dot,一切正常。CPU 使用率低于 1%。但是,当numpy.dot插入一个操作时,CPU 使用率会上升到 12%。有没有人有类似的经历?真的很难理解。

按照@AMC 的建议,我尝试了不同的睡眠时间。

time.sleep(1): 12%, 
time.sleep(2): 4%-7%, 
time.sleep(3): ~3.8%, 
time.sleep(4): 0%-4%

在所有情况下,time.time()-starttime始终为 0.00 秒。似乎numpy.dot很快完成了计算,但仍然占用了一段时间的 CPU。

非常感谢您的阅读。

标签: pythonnumpy

解决方案


def dot(a,b):
    length = b.shape[1]
    c = np.zeros(length)
    for i in np.arange(length):
        c[i] = np.inner(a,b[:,i])
    return c

消耗这么多CPU时间的原因np.dot仍然未知。但是,通过用np.dot上面的函数替换,它似乎是固定的。现在同样的操作只消耗 0.1% 的 CPU 使用率。


推荐阅读