Найти - Пользователи
Полная версия: Ускорение при использовании numpy
Начало » Python для экспертов » Ускорение при использовании numpy
1
Emorh
Здравствуйте!
Решаю задачу по машинному обучению. Одна из частей задания - реализовать вычисление расстояний между точками данными для тренировки и тестовыми точками. Задание разбито на 3 части: реализация с использованием двух циклов, реализация с использованием одного цикла, реализация без использования циклов. Я читал о том, что использование возможностей numpy должно ускорять программу. Но в моём случае я имею следующие результаты:

Запускаю вычисление расстояний между 3000 тренировочными точками и 300 тестовыми.

158 ms ± 20 для реализации с двумя циклами
209 ms ± 33.8 для реализации с одним циклом
201 ms ± 29.5 ms per loop для реализации без циклов

Реализация вычисления матрицы расстояний следующая:
 def compute_distances_two_loops(self, X):
        num_train = self.train_X.shape[0]
        num_test = X.shape[0]
        dists = np.zeros((num_test, num_train), np.float32)
        
        for i_test in range(num_test):
            for i_train in range(num_train):
                dists[i_test][i_train] = np.linalg.norm(X[i_test] - self.train_X[i_train], ord = 2)
        
        return dists
def compute_distances_one_loop(self, X):
        num_train = self.train_X.shape[0]
        num_test = X.shape[0]
        dists = np.zeros((num_test, num_train), np.float32)
        for i_test in range(num_test):
            dists[i_test] = np.linalg.norm(X[i_test] - self.train_X[:], axis = 1, ord = 2)
        return dists
def compute_distances_no_loops(self, X):
        dists = X[:, None] - self.train_X[:]
        return np.linalg.norm(dists, axis = 2, ord = 2)

Подскажите, что я делаю не так? Или результаты абсолютно нормальны?
doza_and
Как часто бывает проблема похоже том что вы не привели.
9.319131675
0.5032883930000001
0.11343997400000028

 import numpy as np
from time import perf_counter
X=np.zeros((30000,5))
train_X = np.zeros((30,5))
def compute_distances_two_loops():
        num_train = train_X.shape[0]
        num_test = X.shape[0]
        dists = np.zeros((num_test, num_train), np.float32)
        
        for i_test in range(num_test):
            for i_train in range(num_train):
                dists[i_test][i_train] = np.linalg.norm(X[i_test] - train_X[i_train], ord = 2)
        
        return dists
def compute_distances_one_loop():
        num_train = train_X.shape[0]
        num_test = X.shape[0]
        dists = np.zeros((num_test, num_train), np.float32)
        for i_test in range(num_test):
            dists[i_test] = np.linalg.norm(X[i_test] - train_X[:], axis = 1, ord = 2)
        return dists
def compute_distances_no_loops():
        dists = X[:, None] - train_X[:]
        return np.linalg.norm(dists, axis = 2, ord = 2)
X=np.zeros((30000,5))
train_X = np.zeros((30,5))
li= [compute_distances_two_loops,compute_distances_one_loop,compute_distances_no_loops]
for i in li:
    t0=perf_counter()
    i()
    t1=perf_counter()
    print(t1-t0)
9.319131675
0.5032883930000001
0.11343997400000028
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB