Прежде чем кто-либо начнет, я знаю, что разговоры о «скорости» в языке программирования - не всегда самое ... полезное обсуждение. Тем не менее, проблема здесь в скорости.
Я рассмотрел задачу 5 проекта Эйлера на обоих языках, и, хотя мои реализации на обоих языках кажутся мне довольно похожими, время выполнения сильно отличается. Java возвращает ответ всего за несколько секунд, тогда как Python может занять до минуты (конечно, на той же машине).Я совершенно уверен, что в этом виноват не столько Python, сколько программист (я), который еще не научился мыслить на языке Python.
Обратите внимание, что я не прошу вас переписывать мой код . Я просто ищу несколько толчков в правильном направлении. (И да, я просмотрел несколько похожих потоков , но большинство из них мне не подходят и напрямую не сравнивают один и тот же алгоритм на двух языках. Этот поток полезен, но, опять же, напрямую не сравнивает Java и Python - и, честно говоря, ответить на этот вопрос немного сложно.)
Без лишних слов:
public class Problem5 {
public static void main(String[] args){
boolean found = false;
for (int i = 20; !found; i += 20){
if (DivisThrough20(i)) {
found = true;
System.out.println(i);
}
}
}
private static boolean DivisThrough20(int number){
boolean result = true;
for (int i = 19; result && i > 1; i--){
if (number % i != 0) result = false;
}
return result;
}
}
def DivisThroughTwenty(number):
for x in range(20,1,-1):
if number % x != 0:
return False
return True
# the number we're looking for can't be any lower than 20, so we'll
# start there as a small optimization
testNumber = 20
keepLooking = True
while keepLooking:
if not DivisThroughTwenty(testNumber):
testNumber += 20
else:
keepLooking = False
print testNumber
Это забавно читая их рядом, я уже вижу, что версия этого алгоритма для Python немного более оптимизирована, чем версия для Java, но все же намного медленнее. Мне еще более любопытно сейчас найти другой способ подойти к проблеме.