Я написал простой код для сравнения производительности вещания и цикла. Код как ниже:
import numpy as np
D = 3072
num_train = 5000
test = np.random.rand(D)
X_train = np.random.rand(num_train, D)
def time_function(f, *args):
"""
Call a function f with args and return the time (in seconds) that it took to execute.
"""
import time
tic = time.time()
f(*args)
toc = time.time()
return toc - tic
def one_test_one_loop():
dists = np.zeros(num_train)
for i in range(num_train):
square_sum = np.sum((test - X_train[i]) ** 2)
dists[i] = square_sum ** (1 / 2)
def one_test_no_loop():
dists = np.zeros(num_train)
square_diffs = (test - X_train) ** 2
square_sums = np.sum(square_diffs, 1)
dists = square_sums ** (1 / 2)
one_loop_time, no_loop_time = 0, 0
for i in range(10):
one_loop_time += time_function(one_test_one_loop)
no_loop_time += time_function(one_test_no_loop)
print ("X_train's shape: (%d, %d)" % X_train.shape)
print ("test's shape: (%d, )" % test.shape)
print('One loop version took %f seconds' % one_loop_time)
print('No loop version took %f seconds' % no_loop_time)
И результат, как показано ниже:
X_train's shape: (5000, 3072)
test's shape: (3072, )
One loop version took 0.484136 seconds
No loop version took 0.934610 seconds
По сути, я вычисляю расстояния L2 между одним тестовым образцом и всеми данными поезда 5000. А функция времени просто возвращает время выполнения функции.
Я ожидал, что вещание будет быстрее, чем версия цикла, однако версия вещания в два раза медленнее, чем версия цикла. Почему?