Векторизованное точечное произведение намного медленнее, чем версия для цикла - PullRequest
1 голос
/ 08 ноября 2019

Ich хотел оптимизировать критическую часть моей программы, где большая часть работы выполняется. Эта работа состоит в вычислении многих точечных продуктов.

В настоящее время я делаю что-то вроде этого:

W = [np.random.rand(n_output, n_input) for _ in range(n_child)]
x = np.random.rand(n_input, batch_size)

for _ in range(n_times):
    for i in range(n_child):
        result[i] = np.dot(W[i],x)
    # work with result

Я хотел оптимизировать эту часть, избавившись от петли for i in range(n_child). Поэтому я сделал следующее:

W = np.random.rand(n_child, n_output, n_input)
x = np.random.rand(n_input, batch_size)

for _ in range(n_times):
    results = np.dot(W,x)
    # work with result

Однако это оказалось намного медленнее. Я что-то пропустил? В приведенном ниже примере мой второй подход примерно в 30 раз медленнее. Как это возможно?

Вот полностью рабочий пример:

import numpy as np
import time

n_child = 32
n_input = 1000
n_output = 20
batch_size = 64

W = np.random.rand(n_child, n_output, n_input)
x = np.random.rand(n_input, batch_size)

n_times = 1000

t0 = time.time()
for _ in range(n_times):
    np.dot(W,x)
t_a = time.time() - t0
print(t_a) # takes about 60 seconds on my machine

W = [np.random.rand(n_output, n_input) for _ in range(n_child)]

t0 = time.time()
for _ in range(n_times):
    for i in range(n_child):
        np.dot(W[i],x)
t_b = time.time() - t0
print(t_b) # takes about 3 seconds on my machine
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...