Производительность Python VS Производительность Java

24

На SO я натолкнулся на вопрос о том, какую платформу, Java или Python лучше всего разрабатывать в Google AppEngine. Многие люди хвастались возросшей производительностью, достигнутой благодаря использованию Python поверх Java. Одна вещь, которую я хотел бы сказать о аргументе производительности Python против Java, - это то, что у Java есть отличные IDE для ускорения разработки, поскольку Python действительно не хватает в этой области из-за его динамической природы.

Поэтому, хотя я предпочитаю использовать Python в качестве языка, я не верю, что он дает прирост производительности по сравнению с Java, особенно при использовании нового фреймворка. Очевидно, что если бы это была Java против Python, и единственным редактором, который вы могли бы использовать, был VIM, то Python обеспечил бы вам огромный прирост производительности, но когда IDE были введены в уравнение, это не так ясно.

Я думаю, что достоинства Java часто оцениваются исключительно на уровне языка и часто на устаревших предположениях, но у Java есть много преимуществ, внешних по отношению к самому языку, например, JVM (часто критикуемая, но обладающая огромным потенциалом), отличные IDE и инструменты, огромное количество третьих партийные библиотеки, платформы и т. д.

Вопрос, действительно ли Python / родственные динамические языки дают огромное повышение производительности, о котором часто говорят? (с учетом использования новых фреймворков и работы со средними и большими приложениями).

toc777
источник
2
Проверьте PyCharm IDE. Кроме того, я считаю, что существует некоторая новая структура для GAE, которая преобразует код Java в JavaScript для использования на внешнем интерфейсе, что может значительно повысить производительность.
Андрей М
14
IDE или нет, вам все равно нужно написать 10 строк Java для некоторых вещей, которые можно сделать (хорошо) в одной строке Python.
2
Не стыдитесь своей любви к Java. Вы выучили несколько трюков (IDE, библиотеки и фреймворки), которые позволяют вам надрать задницу. Прими это. Вам не нужно разрешение от нас, чтобы быть удивительным. Если Java делает вас продуктивным, то этого достаточно.
Скудный Роджер
1
1) Потенциал JVM очень ограничен . Умышленно. Это не «плохо», это всего лишь ограничение. 2) IDE могут помочь только в том случае, если все, что вы делаете, - это интеграция сотен существующих компонентов (что является допустимым и уважаемым видом программирования, но не единственным). Когда дело доходит до реализации сложных алгоритмов, Python намного более продуктивен, чем Java (даже такие вещи, как лямбда-функции и списочные выражения имеют огромное значение).
SK-logic
1
Если ваша IDE значительно повышает производительность, то есть вероятность, что с вами или вашей платформой программирования что-то ужасно не так. (Smalltalk является исключением из-за того, что он создает полностью отражающую систему для программирования).
Марцин

Ответы:

18

Одним из главных преимуществ Python является его философия «батареи включены»: обширная и простая в использовании стандартная библиотека. В Java простое чтение текстового файла требует нескольких строк кода, вложенных читателей и тому подобного. В Python это так f.read(). Это, безусловно, значительно повысит производительность, особенно в области быстрого прототипирования. Язык Python также, как правило, менее многословен, что неплохо (хотя я думаю, что важность многословия и краткости часто переоценивается).

Однако, если вы уже работаете над какой-то платформой, такой как GAE, то я ожидаю, что различия будут намного меньше, и, в основном, вплоть до личного владения языком. Вы будете в основном просто соединять фреймворк с выбранным синтаксисом, и там отличная стандартная библиотека Python мало поможет.

Joonas Pulakka
источник
Мне действительно нужно научиться пользоваться GAE. Любые онлайн-учебники серии вы бы порекомендовали? Я знаком с Python, но понятия не имею о GAE. Благодарность!
@Sergio: code.google.com/appengine/docs :-)
Joonas Pulakka
4
Или вы можете добавить Apache Commons IO со строкой конфигурации Maven, а затем читать файлы в одной строке. Подход с батарейками для меня - обоюдоострый меч.
Джигги
@jiggy: я согласен в некоторой степени; Батареи Python почти всегда полезны и часто достаточны, но очевидно, что стандартная библиотека не может обслуживать все возможные цели, поэтому иногда приходится прибегать к библиотекам.
Joonas Pulakka
2
Чтение текстового файла в Java: List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. Не так уж плохо! (Это Java 7, который не был выпущен еще 11 марта).
assylias
19

Вот мои 2 цента. По моему опыту, Python хорош для небольших и средних проектов, тогда как для более крупных проектов я более продуктивен с Java.

В общем, я могу использовать динамически типизированный язык, такой как Python (или PHP), для небольших проектов: он не слишком сложен, вы хотите сделать это быстро, и не так уж много может пойти не так. В этом случае я считаю, что Python может быть более практичным в использовании.

Однако, когда мне нужно разработать более крупную часть программного обеспечения, я предпочитаю статически типизированный язык, такой как Java, потому что я предпочитаю, чтобы компилятор выполнял для меня как можно больше проверок. Мой опыт показывает, что в более крупных проектах мне приходится тратить больше времени на исправление ошибок с Python, чем с Java, поэтому я не беспокоюсь, если для написания кода на Java потребуется немного больше, потому что это сэкономит время позже.

Джорджио
источник
6
+1, полностью согласен. Мне нравится использовать Python и подобные языки в небольших проектах, где я могу без труда обернуть голову вокруг всего их объема. Проблема возникает в более крупных проектах, где вы должны определить интерфейсы между компонентами. Это в сочетании с более слабой поддержкой рефакторинга делает меня менее уверенным в создании больших, стабильных, обслуживаемых систем. Необходимо написать и поддерживать множество тестов, чтобы компенсировать отсутствие статического анализа, выполняемого компилятором. Когда дело доходит до этой точки, преимущество быстрой начальной итерации теряется в обслуживании.
bunglestink
Я использую оба, и мне нравятся оба. Я полностью согласен с вами.
Даниэль Бактиар
11

Я гораздо более продуктивен в более мощных языках, таких как Python или Ruby. Неважно, может ли часть кода Java быть сгенерирована IDE. Существует больше кода для чтения и поддержки. Требуется больше времени, чтобы пройтись по повторяющемуся коду и найти важные части, и больше времени, чтобы изменить его. Хорошо, что Eclipse может конвертировать

private Date dateOfBirth;

чтобы:

private Date dateOfBirth;
public Date getDateOfBirth() { return dateOfDeath; }
public setDateOfBirth(Date d) { dateOfBirth = d; }

но каждый раз, когда я открываю класс, я вижу этот мусор и должен пройти мимо него, чтобы найти интересные части. Также, во время обслуживания, ошибки могут быть внесены в сгенерированный код.

Я бы предпочел увидеть:

attr :date_of_birth

Для меня потребность в IDE для эффективной работы с Java - хороший повод выбрать другой язык.

Возможно, более убедительно, сравните этот код Ruby:

avg = people.filter { |p| p.height > 200 }.collect(:weight).average

против аналогичного кода Java:

List<Double> weights = new ArrayList<Double>();
for (Person p: people) {
  if (p.getHeight() > 200) {
    weights.add(p.getWeight());
  }
}
return Stats.average(weights);

Код Ruby - это прямой перевод спецификации: средний вес людей выше 200 (см). Комментарий был бы совершенно излишним.

Код Java требует значительной работы как для записи, так и для чтения.

В этом эссе Пол Грэм приводит убедительный аргумент в пользу краткости языков программирования . После некоторой математики на уровне выпускника я нахожу его аргумент убедительным, а аргументы против краткости - слабыми. Конечно, единственную строку в языке высокого уровня понять сложнее, чем одну строку в языке низкого уровня, так же как уравнение в частных производных сложнее понять, чем простое сложение. Но одну строку в мощном языке легче понять, чем пять или десять строк, которые он заменяет. Представьте себе чтение математического текста, который был написан с использованием слов вместо символов.

Кевин Клайн
источник
Я не использовал Python, но использовал C #, который имеет свойства auto. Насколько сложно в Python добавить логику в это (скажем, запустить событие или логику проверки)?
млк
@mlk - утверждение "attr" взято из Ruby. В Ruby очень просто прикрепить поведение, когда свойство установлено.
Кевин Клайн
В python все атрибуты класса автоматически становятся открытыми, поэтому большую часть времени вы будете обращаться к ним напрямую.
Чжэхао Мао
3
Python не нуждается в геттерах или сеттерах - просто dateOfBirthобнародуйте. Если к нему необходимо добавить логику позже при получении или установке, добавьте a _dateOfBirthдля хранения данных, а затем создайте propertyименованный dateOfBirthметод get и set. Код вызова вообще не нужно менять в Python. Java использует только методы доступа, потому что не имеет понятия «свойства».
Изката
1
С помощью Java 8 и потоков ваш код среднего веса может быть записан так:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
vitro
7

Я перешел с Java на Python несколько лет назад и лично чувствую, что я более продуктивен. Как отмечает @Joonas, большая часть производительности достигается за счет упакованной библиотеки. Но отчасти это из самого языка. Я не могу представить, чтобы не было словарей, списков, функций более высокого порядка и оболочки.

Имейте в виду, что если вы уже знаете Java, потребуется некоторое время, чтобы свободно владеть Python.

Дейв
источник
7

Это старый вопрос, но я хотел бы добавить свои $ .03. Я думаю, что это сильно зависит от того, как ты думаешь. Я, например, действительно терпеть не могу динамические, интерпретированные языки. С другой стороны, я большой поклонник статически типизированных языков. Конечно, использование Java может быть более многословным, но я считаю, что его легче читать и поддерживать, как только все будет сказано и сделано. Я считаю Python, Ruby и Perl чрезвычайно трудными для чтения (для меня). Я просто не могу обернуть голову, хотя я пытался. Тем не менее, я могу написать код на Scala просто отлично, и это не имеет большого значения. Я думаю, это зависит от того, что вам удобно. В конце дня Java станет намного мощнее; больше, чем Ruby, Python или Perl. JVM является неотъемлемой частью технологии, и обучение ее использованию может оказаться очень полезным для вас.

Nodey The Node Guy
источник
1
Согласен, конечно, вы можете по-настоящему быстро взломать Python, но он может стать кошмаром для отладки позже или для добавления новых функций, поэтому его часто называют «языком прототипов», и это то, для чего я считаю его полезным (или для скрипты типа hoc)
programmx10
2
когда наступит конец этого дня? Мы ждали около 20 лет, и у Java до сих пор нет первоклассных функций или каких-либо средств метапрограммирования. Тем временем C # продвинулся чрезвычайно. За прошедший год я начал писать код на Groovy вместо Java, и моя производительность значительно возросла. Groovy-код намного меньше и его легче понять, чем соответствующий Java-код, потому что шум исчез.
Кевин Клайн
@Kevin Cline - я знаю, что вы говорите - я был разработчиком .NET последние шесть лет или около того. Я говорю не просто о производительности, а о времени компиляции, параллелизме и многоядерных типах. Java и JVM (Groovy, Scala и т. Д.). JVM - это то, что здесь является самым важным, а не обязательно самой Java.
Nodey The Node Guy
2
@ programmx10 Поддерживаемость вашего кода Python зависит от того, как вы его написали. Если вы сделали все это одним большим клугом, то, конечно, вы не сможете его отладить. Если, с другой стороны, вы хорошо организовали свой код и разделили свою функциональность на модули и классы, то поддерживать его будет так же легко (если не проще), как Java-код.
Чжэхао Мао
5

Я считаю, что Python, Ruby, Javascript и SQL намного более продуктивны, чем скомпилированные языки, такие как Java, потому что эти языки имеют очень быстрый цикл обратной связи. Вы можете запустить несколько строк кода в командной строке и сразу узнать, верен ли этот код или нет. Если это бросает исключения, вы знаете, немедленно. С помощью Java вы должны компилировать, упаковывать и развертывать, что может часто занимать минуты для больших систем, что приводит к очень медленному циклу обратной связи.

Быстрый цикл обратной связи позволяет быстро перейти к хорошему решению, и это делает динамические языки более производительными.

Джей Годсе
источник
отличное применение терминаfeedback loop
амфибия
3

В последнее время я занимался гораздо большим количеством Python и долгое время был программистом на Java, и для совершенно новой разработки, я думаю, я немного более продуктивен в Python. многие довольно простые вещи в java могут быть немного утомительными, такие как обработка файлов / потоков, чтение материала с URL, сериализация XML и т. д. с помощью «утомительного», я имею в виду то, что вам нужно 5 строк кода в java, часто кажется возьмите только один в питоне. однако использование правильных инструментов, таких как guava или API других коллекций, действительно может помочь в этом.

Я предполагаю, что говорю о том, что одним из преимуществ python является то, что он поставляется с множеством функций, которые вам необходимы для использования сторонней библиотеки в java.

Несмотря на все сказанное, в некоторых случаях я буду гораздо продуктивнее в Java, чем в Python, особенно когда речь идет о рефакторинге и работе с большими кодами и т. д.

Пол Санвальд
источник
1
Java - это все о библиотеках, хотя с Python у них есть куча методов, вроде PHP, где их трудно запомнить, а с Java вы просто ищете соответствующую библиотеку, и тогда у вас по крайней мере есть выбор: к тому, что вы используете
programmx10
1
@ programmx10 О чем ты говоришь? Python имеет множество библиотек для всех видов вещей. Просто посмотрите на документацию для стандартной библиотеки. Библиотеки Python разделены на модули так же, как библиотеки Java разделены на пакеты.
Чжэхао Мао