python - 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。
非常感谢您的阅读。
解决方案
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 使用率。
推荐阅读
- django - Heroku 调试标志不停止 django 调试
- python - 在python中绘制分类散点图/线图
- flutter - Flutter shared_preferences 0.5.7 APP重新加载后无法获取值
- wordpress - WordPress分页上的锚链接
- ios - 如何在 UITabBar 中创建任何 ViewController 初始值?
- github - rebase合并提交后如何恢复合并?
- rest - @OneToOne 对于 Null @JoinColumn JPA 失败
- python - python中的函数print什么都不显示
- rest - 粉碎 CRUD,只需 POST-it:对所有操作使用 POST 是否比实施 CRUD 更好?
- javascript - 当 AsyncSelect 被另一个组件包装时,不会调用 loadOptions