У меня есть проблема, которую я уже решил как в python, так и в java. Проблема заключается в том, для таблицы умножения 8000 * 8000 элементов, найти все уникальные номера:Скорость реализации Java и Python
Python:
table = 8000
unique_prods = []
start = 1
for i in range(table*table + 1):
unique_prods.append(0)
for x in range(1, table + 1):
for y in range(start, table + 1):
# print '{:4}'.format(x * y),
if not unique_prods[x * y] == x * y:
unique_prods[x * y] = x * y
start += 1
# print
# print unique_prods
print len(unique_prods)
Java:
public class Test {
public static void main(String[] args) {
int table = 8000;
int [] myArray = new int[table*table + 1];
int count = 1;
for (int i = 0; i < table*table + 1; i++) {
myArray[i] = 0;
}
for (int x = 1; x < table + 1; x++) {
for (int y = count; y < table + 1; y++) {
if (! (myArray[x * y] == x * y)) {
myArray[x * y] = x * y;
}
}
count += 1;
// System.out.println(count);
}
count = 0;
for (int i = 0; i < table*table + 1; i++) {
if(myArray[i] != 0) {
count += 1;
}
}
System.out.println(count);
}
}
Я нашел, что это удивительно, что реализация Java занял второе место, и версия Python заняла минуту. Есть ли способ повысить производительность python, чтобы он стал ближе к скорости реализации Java?
О, я видел теперь, что Python выплюнул неправильный ответ, но это можно легко устранить, итерации по списку. Извини за это. –
Почему вы проверяете, не соответствует ли 'myArray [x * y]' 'x * y' перед установкой его равным' x * y'? Если он уже равен, то установка его равным самому себе не изменяет его значение. Если он уже не равен, он будет установлен в 'x * y'. 'If' является излишним. – curiousinternals
'for i in range (table * table + 1): unique_prods.append (0)' следует заменить на 'unique_prods = [0] * (table * table + 1)', что в 15 раз быстрее на моей машине. – PeterE