Numpy точка завершается быстро, но постоянно занимает много времени процессора - PullRequest
0 голосов
/ 19 января 2020

Вот простой код, который вычисляет скалярное произведение вектора и матрицы.

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 быстро завершил вычисления, но некоторое время все еще занимал процессор.

Большое спасибо за чтение.

1 Ответ

0 голосов
/ 30 января 2020
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

Причина, по которой np.dot потребляет так много процессорного времени, до сих пор неизвестна. Тем не менее, при замене np.dot на приведенную выше функцию, это кажется исправленным. Теперь та же операция стоит всего лишь 0,1% загрузки процессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...