Вот простой код, который вычисляет скалярное произведение вектора и матрицы.
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.
...
Однако, когда я смотрю на диспетчер задач, я вижу, что процесс постоянно занимает все ядро ЦП или поток: ~ 12% в 6-ядерном 12-поточном ЦП. Кажется, что инструкция time.sleep(1)
вообще не работала.
Эта проблема много раз воспроизводилась на платформе X86-X64 с Ubuntu 1804 и Windows 10, а также на платформе ARM с Ubuntu1804. Если я НЕ использую numpy.dot
, все в порядке. Загрузка процессора ниже 1%. Но когда была вставлена операция numpy.dot
, загрузка процессора возросла до 12%. У кого-нибудь есть подобный опыт? Это действительно трудно понять.
Следуя совету @ AM C, я пробовал разное время сна.
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
быстро завершил вычисления, но некоторое время все еще занимал процессор.
Большое спасибо за чтение.