У меня есть вопрос относительно производительности определенного фрагмента кода на Java и Python.
Алгоритм:
Я генерирую случайных N-мерных точек , а затем для всех точек, находящихся на определенном расстоянии друг от друга, выполняю некоторую обработку. Сама обработка здесь не важна, так как она не влияет на общее время выполнения. Генерация точек также занимает доли секунды в обоих случаях, поэтому меня интересует только та часть, которая выполняет сравнение.
Время выполнения:
Для фиксированного ввода в 3000 точек и 2 измерений Java делает это за от 2 до 4 секунд , тогда как Python занимает где-то от 15 до 200 секунд .
Я немного скептически отношусь ко времени выполнения Python. Что-то мне не хватает в этом коде Python? Есть ли какие-либо алгоритмические предложения по улучшению (например, предварительное выделение / повторное использование памяти, способ снижения сложности Big-Oh и т. Д.)?
Java
double random_points[][] = new double[number_of_points][dimensions];
for(i = 0; i < number_of_points; i++)
for(d = 0; d < dimensions; d++)
random_points[i][d] = Math.random();
double p1[], p2[];
for(i = 0; i < number_of_points; i++)
{
p1 = random_points[i];
for(j = i + 1; j < number_of_points; j++)
{
p2 = random_points[j];
double sum_of_squares = 0;
for(d = 0; d < DIM_; d++)
sum_of_squares += (p2[d] - p1[d]) * (p2[d] - p1[d]);
double distance = Math.sqrt(ss);
if(distance > SOME_THRESHOLD) continue;
//...else do something with p1 and p2
}
}
Python 3,2
random_points = [[random.random() for _d in range(0,dimensions)] for _n in range(0,number_of_points)]
for i, p1 in enumerate(random_points):
for j, p2 in enumerate(random_points[i+1:]):
distance = math.sqrt(sum([(p1[d]-p2[d])**2 for d in range(0,dimensions)]))
if distance > SOME_THRESHOLD: continue
#...else do something with p1 and p2