Я читаю наборы данных из файла в массивы numpy
следующим образом:
def read_data(filename):
data = np.empty(shape=[0, 65], dtype=int)
with open(filename) as f:
for line in f:
data = np.vstack((data, np.array(list(map(int, line.split(','))), dtype=int)))
return data
Я использую numpy
для вычисления евклидова расстояния между двумя списками:
def euclidean_distance(x, z):
return np.linalg.norm(x-z)
После этого я вычисляю евклидовы расстояния следующим образом:
for data in testing_data:
for data2 in training_data:
dist = euclidean_distance(data, data2)
Моя проблема в том, что этот код работает очень медленно, для завершения требуется около 10 минут. Как я могу улучшить это, что я упускаю?
Мне нужно использовать расстояния в другом алгоритме, поэтому скорость очень важна.
N
иM
— размерtesting_data
иtraining_data
соответственно. Итак, это зависит от того, насколько велики оба этих набора данных. - person kmario23   schedule 06.05.2019list
и просто использоватьnp.fromiter(map(int, line.split(',')))
, хотя я думаю, что это может не дать такого большого улучшения. Другой вариант — избавиться от функцииeuclidean_distance()
и напрямую встроить код, поскольку это всего лишь одна строка. Это может дать небольшой прирост, поскольку мы избегаем 6,8 млн вызовов функций. - person kmario23   schedule 06.05.2019cdist
, а также ручную реализацию с использованиемnumpy.linalg.norm
и не заметил большой разницы в скорости. - person kmario23   schedule 06.05.2019cdist
, и он запускается за 2 секунды, и если я улучшу свой код, как вы сказали @kmario23, это займет столько же времени, сколько и раньше. Я не хочу использоватьcdist
, потому что это создает матрицу. Как это возможно? - person Fogarasi Norbert   schedule 06.05.2019