Продуктивність Python VS Java Productivity


24

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

Тож, хоча я вважаю за краще використовувати Python як мову, я не вважаю, що це дає достатньо підвищення продуктивності порівняно з Java, особливо при використанні нового фреймворку. Очевидно, якби це Java проти Python, і єдиним редактором, яким ви могли користуватися, був VIM, то Python дасть вам величезний приріст продуктивності, але коли IDE будуть внесені в рівняння, це не настільки чітке скорочення.

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

Питання: Чи дійсно Python / пов'язані з ними динамічні мови справді дають величезний приріст продуктивності, про який часто говорять? (з урахуванням використання нових рамок та роботи із середніми та великими додатками).


2
Перевірте IDE PyCharm. Але я також вважаю, що для GAE є якась нова рамка, яка перетворює код Java в JavaScript для використання на передній частині, що може призвести до значного збільшення продуктивності.
Ендрю М

14
IDE чи ні, вам все одно потрібно написати 10 рядків Java для деяких речей, які можна зробити (добре) в одному рядку Python.

2
Не соромся своєї любові до Яви. Ви дізналися кілька хитрощів (IDE, бібліотеки та фреймворки), які дозволяють бити недопалки. Прийняти це. Вам не потрібен дозвіл від нас, щоб бути приголомшливим. Якщо Java робить вас продуктивними, то цього достатньо.
Мізерний Роджер

1
1) Потенціал СВМ дуже обмежений . Навмисно. Це не «погано», це просто, добре, обмежує. 2) ІДЕ може допомогти лише в тому випадку, якщо все, що ви робите, - це інтегрування сотень існуючих компонентів (що є правильним і заслуженим видом програмування, але не єдиним). Що стосується реалізації складних алгоритмів, Python настільки продуктивніший, ніж Java (навіть такі речі, як лямбда-функції та розуміння списків, мають величезну зміну).
SK-логіка

1
Якщо ваша продуктивність значно збільшиться завдяки вашій IDE, то ймовірність полягає в тому, що з вами або з вашою платформою програмування щось страшенно не так. (Smalltalk - це виключення, оскільки він створює повністю відображаючу систему програмування).
Marcin

Відповіді:


18

Однією з головних переваг Python є його філософія "включені батареї": велика і проста у користуванні стандартна бібліотека. У Java для простого читання текстового файлу потрібно кілька рядків коду, вкладених читачів тощо. У Python це f.read(). Це, безумовно, буде величезним підвищенням продуктивності, особливо у швидкому прототипуванні. Мова Python в цілому є менш багатослівною, що не є поганою справою (хоча, я думаю, важливість багатослівності проти стислість часто завищена).

Однак, якщо ви вже працюєте над деякими рамками, такими як GAE, я б очікував, що різниці будуть набагато меншими, і, головним чином, залежать від особистого володіння мовою. Ви будете здебільшого просто підключати рамки разом із синтаксисом на ваш вибір, і там велика стандартна бібліотека Python мало допомагає.


Мені справді потрібно навчитися користуватися ГАЕ. Будь-яку серію навчальних посібників, яку ви порекомендуєте? Я знайомий з Python, але не маю поняття про GAE. Спасибі!


4
Або ви можете додати IO Apache Commons IO з рядком конфігурації Maven, а потім також прочитати файли в одному рядку. Підхід із включеними батареями - для мене меч з двома ребрами.
джиггі

@jiggy: я певною мірою погоджуюся; Акумулятори Python майже завжди корисні і часто достатні, але, очевидно, стандартна бібліотека не може обслуговувати всі можливі цілі, тому вам доводиться іноді повертатися до бібліотек.
Joonas Pulakaka

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);

Код Рубі - це прямий переклад специфікації: середня вага людей вище 200 (см). Коментар був би абсолютно зайвим.

Код Java вимагає значної роботи як для запису, так і для читання.

Пол Грем робить переконливий аргумент для стислості в мовах програмування в цій статті . Виконавши деякі випускники з математики рівня, я вважаю його аргумент переконливим, а аргументи проти стислості слабкими. Безумовно, один рядок мовою високого рівня може бути важче зрозуміти, ніж один рядок мовою низького рівня, так само як часткове диференціальне рівняння важче зрозуміти, ніж просте додавання. Але єдиний рядок на потужній мові зрозуміти легше, ніж п'ять-десять рядків, які він замінює. Уявіть, що читаєте математичний текст, написаний із використанням слів замість символів.


Я не використовував Python, але використовував C #, який має автоматичні властивості. Скільки роботи в Python, щоб додати логіку до цього (скажімо, запуск події чи логіку перевірки)?
mlk

@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 стане набагато потужнішою; більше, ніж Рубі, Пітон або Перл. JVM - це переконлива технологія, і навчитися використовувати її потужність може виявитися дуже корисною для вас.


1
Домовились, впевнені, що ви можете швидко зламати Python, але це може стати кошмаром для налагодження пізніше або додавання нових функцій, саме тому його часто називають "мовою прототипу", і саме для цього я вважаю його корисним (або для реклами - хок тип скриптів)
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

Нещодавно я займався набагато більшим пітоном і тривалий час був програмістом java, а для абсолютно нових розробок, я думаю, що я досить продуктивніший у python. багато явних справ у Java можуть бути трохи стомлюючими, як обробка файлів / потоків, читання матеріалів з URL-адреси, серіалізація XML тощо за допомогою "стомлюючого", я маю на увазі те, що займає у вас 5 рядків коду в Java, здається, часто візьміть лише один пітон. використання правильних інструментів, таких як guava або інший API колекцій, справді може допомогти у цьому.

Я думаю, я говорю, що однією з переваг python є те, що він має багато функцій, для отримання яких вам потрібно використовувати сторонню бібліотеку в Java.

все, що було сказано, для певних речей я був би набагато продуктивнішим у Java, ніж міг би бути у python, особливо коли мова йде про рефакторинг та роботу з великими кодовими базами тощо.


1
Java - це все про бібліотеки, хоча у Python у них є маса методів, подібних до PHP, до яких важко запам’ятати їх усі, з Java ви просто шукаєте відповідну бібліотеку, і тоді у вас є принаймні вибір, як до того, що ви використовуєте
programmx10

1
@ programmx10 Про що ти говориш? У Python є безліч бібліотек для всіляких речей. Просто подивіться документацію для стандартної бібліотеки. Бібліотеки Python розділені на модулі, подібно до того, як бібліотеки Java розділені на пакети.
Чжехао Мао
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.