Почему вещание медленнее, чем для цикла в этом случае? - PullRequest
0 голосов
/ 30 апреля 2018

Я написал простой код для сравнения производительности вещания и цикла. Код как ниже:

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. А функция времени просто возвращает время выполнения функции.
Я ожидал, что вещание будет быстрее, чем версия цикла, однако версия вещания в два раза медленнее, чем версия цикла. Почему?

...