Чи програмування в Python швидше, ніж у C, C ++ чи Java? [зачинено]


27

Серед поширена думка, що чим динамічніше і вільніше набирається мова, тим продуктивнішим буде програміст. Гвідо ван Россум писав про продуктивність програмування за допомогою python у 1998 році та пошуку в Інтернеті, я все ще бачу людей, які посилаються на цю точну заяву:

Синтаксично код Python виглядає як виконуваний псевдо-код. Розробка програми за допомогою Python в 5-10 разів швидша, ніж використання C / C ++ і в 3-5 разів швидше, ніж використання Java. У багатьох випадках прототип програми може бути записаний на Python, не записуючи жодного коду C / C ++ / Java. Часто прототип є достатньо функціональним і працює досить добре, щоб бути доставленим як кінцевий продукт, економлячи значний час на розробку. В інших випадках прототип можна частково або повністю перекласти на C ++ або Java - об'єктно-орієнтована природа Python робить переклад простою процедурою.

Чи належним чином було науково оцінено це питання? Якщо не для то, можливо, для подібних мов сценаріїв, таких як , або ?

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

Я спочатку задав це питання на скептиці.SE , і хтось запропонував мені також його задати тут.


25
Ну, оскільки ви обмежили набір можливих відповідей, я просто смію зауважити, поставивши ще одне питання, на який слід відповісти спершу (імхо): Чи є надійні та вмілі показники для вимірювання "продуктивності програміста"?
Пол Міхалик

1
@Paul Michalik - Я б припустив, що будь-який дослідницький документ, що розглядає продуктивність, повинен містити визначення (інакше це було б важко виміряти). Тож якщо хтось посилався на дослідження, було б корисно, якби вони включили визначення у відповідь. Напевно, є (я здогадуюсь) декілька різних цілком прийнятних способів вимірювання продуктивності, можливо, "час, необхідний для проходження ряду одиничних тестів", був би одним із них.
Kit Sunde

1
@Paul Michalik - Звичайно, але скільки тверджень, які ви читаєте в книгах, блогах, бесідах та статтях програмістів, насправді перевіряється емпірично? Я впевнений, що існують кращі чи гірші способи вимірювання продуктивності. Наприклад. "Споживання / час кави", ймовірно, буде гіршим, ніж навіть класичний "Рядок коду / час". Я б заперечив судження щодо конкретних тверджень про продуктивність, які ми бачили, і на цьому можу стверджувати достоїнства. Твердження про продуктивність також не просто помилкові, я впевнений, що "рядки код / ​​час" щось вимірюють, коли люди не намагаються знищити показник.
Kit Sunde

1
Можливо, вас зацікавить ця стаття: citeseerx.ist.psu.edu/viewdoc/…
DistantEcho

1
@ChrisF - Ви хочете сказати, що цей питання не застосовується до Programmers.SE? Це, безумовно, скептикам, і, здавалося, тут теж підходить. Я був під враженням , що ви не повинні , поки я прочитав недавній коментар Роберта Cartaino з цього питання: skeptics.stackexchange.com/q/1963/631 , який по суті говорить , що це абсолютно нормально , якщо це становить інтерес для обох громад, і Я це зробив лише після того, як мене запропонував інший користувач зробити це. Зважаючи на те, що питання викликає актуальність, здається, це зацікавить і цю громаду.
Kit Sunde

Відповіді:


17

Стаття 1 Ousterhout про мови сценаріїв говорить про те, що чим вище відбувається програмування, тим продуктивнішим є програміст. Якщо взяти до уваги, що, як каже Бом 2 , кількість рядків, які програміст може записати за певний час, є постійною і не залежить від мови та її типу (низький рівень, системне програмування, сценарій), можна легко повірити у твердження. Отримані вказівки для співвідношення код-рядок-код-рядок можуть бути на порядок (або кілька) кращими для мов сценаріїв, ніж для мов програмування системи.

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

[1]: JK Ousterhout, Сценарій: Програмування вищого рівня для 21 століття , Комп'ютер (IEEE), 1998
[2]: Б. Боем, Економіка програмного забезпечення, Економіка програмного забезпечення , Prentice Hall, 1981


9
Хоча це хороша відповідь, не забувайте, що сучасні мови без сценарію також мають в своєму розпорядженні пакунки готовими утилітами, які швидко розвивають. С # приходить на думку. Кожен, хто відчуває, що Python має більше утилітів, що попередньо консервуються, ніж C #, просто трапляється знати Python краще, ніж C #. Насправді вони обидва мають широкий і порівняний спектр "вбудованих" утиліт.
Роман Старков

@romkyns, для будь-якого нетривіального проекту потрібно написати багато коду. Навіть якщо у вас багато цеглинок Лего, Біонікли не чарівно збираються.

2
@Тор, але насправді це дуже допомагає, щоб ті цегли Lego були вперед, замість того, щоб спочатку будувати свердло для масла, пластикову фабрику та блок екструдера лего.
Роман Старков

2
і c ++, і Java мають загальні контейнери, а c ++ 11 має таку повну стандартну ліб для алгоритмів сортування та ітераторів тощо. Я не впевнений, що хтось програмує python був би суттєвою перевагою. Крім того, я впродовж більшої частини свого програмування витрачаю на розробку того, що мені потрібно робити, а не набираючи текст. Тому я думаю, що підрахунок кількості рядків, необхідних для того, щоб зробити щось, не є чітким показником того, наскільки швидко ви програмістом на цій мові.
Сем Редвей

7

Якщо ви оцінюєте продуктивність як "час написання певної простої програми", то це набагато більше залежить від досвіду програміста та швидкого розуму, ніж від мови, яку ви дійсно оцінюєте програмістом, а не мовою.

Я вважаю, що змагання з приуроченим кодом вказують на те, що мова не дуже важлива для таких завдань. Немає жодної мови, яка перемагає такі виклики простіше, ніж інші (принаймні, не, якщо ви дозволите відносну популярність мов).

Якщо ви оцінюєте ефективність як "ефективність найкращої програми", написану певною мовою, то це ще менше залежить від мови. Ознайомтеся, наприклад, з результатами конкурсу Galcon AI . Переможець пишеться в Ліспі. Наступний запис Lisp, однак, займає # 280. Що це говорить нам про придатність мови для ефективного письма AI? На мою думку, нічого. Це просто говорить нам, що "bocsimacko" придумав та реалізував найефективніші алгоритми. Для запису час не був головним фактором цього конкурсу - люди мали більше двох місяців, щоб розробити свій код.

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


7
"ви дійсно оцінюєте програміста, а не мови" - Не, якщо це насправді зроблено науково. Візьміть 100 програмістів. Виберіть загальний проект, наприклад "Написати додаток для календаря з цими конкретними вимогами". Вимоги пов'язані з автоматизованим тестуванням блоку. 50 програмістів пишуть додаток на C ++, 50 - на Python, вибраному випадковим чином, щоб якісні розробники рівномірно відходили. Результати були б оцінкою, що поєднує середній час до завершення з кількістю пройдених одиниць тестів. Порівняйте середнє значення результатів Python із середнім результатом C ++ та ... НАУКА!
Морган Херлоккер

2
@Prof Можливо, якщо ви отримуєте тисячу з кожного ... але все-таки, як ви контролюєте той факт, що C ++ знатимуть лише люди з певним мисленням та певним рівнем здібностей?
Роман Старков

ви можете зробити свій зразок лише для людей, які можуть скласти тест на знання C ++ та Python. Дуже багато моїх старих професорів займалися дуже подібними дослідженнями. Також ви робите кілька припущень, які інші обговорювали тут: programmers.stackexchange.com/q/73715/3792
Морган Херлокер

6

http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprtTR.pdf - одне з небагатьох досліджень, про які я знаю, що здійснило фактичне безпосереднє порівняння між продуктивністю на різних мовах. Він старий, але варто прочитати, якщо ви вважаєте тему цікавою. Порівняння має низку основних недоліків, про які в статті дуже чесно.

Загальний результат полягає в тому, що мови низького рівня (наприклад, C, C ++) пишуть більше часу, можуть займати набагато менше пам’яті та працювати набагато швидше. Але з дуже високою мінливістю. Мови сценаріїв високого рівня, як правило, займають удвічі більше часу і мають меншу варіативність у підході. Спочатку дивно, що існує очевидний спосіб зробити щось на мові сценаріїв.

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


1

Якщо говорити загалом, написання програми на Python, як правило, буде швидше, ніж написання тієї самої програми на C, C ++, Java.

Також, швидше за все, біжить повільніше.

Звичайно, є спеціальні програми, для яких інші мови можуть бути швидшими, оскільки певні завдання, які пов'язані із завданням, підтримуються "ріднішими".

Хоча я не знаю жодного дослідження, яке підтверджувало б збільшення швидкості / продуктивності (як зазначав один із коментаторів, це важко точно виміряти), було проведено пряме дослідження виразності мови.

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

Це показує в таблиці оцінку співвідношень виразності мов. Хоча його слід брати із зерном солі, виноски, про які йдеться, дуже варті.

http://en.wikipedia.org/wiki/Comppare_of_programming_languages#Expressiveness


-5

Востаннє я використовував Java (деякий час тому, правда,), для відкриття та запису у файл знадобився екран, повний коду. Порівняйте це з парою рядків у Python або Perl, і ви можете здогадатися, який з них швидший.

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


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

Звичайно, але мови Python, Perl та вищі версії загалом заздалегідь подумували над цим матеріалом, і тому вам не потрібно писати класи утиліти (чи не стільки їх). Використання класу утиліти все ще потребує часу, і це принцип багаторазового використання коду, який застосовується як до Java, так і до Python, залежно від того, що ви робите.
wobbily_col

Це передбачає, що Ява потребує 50 - 60 рядків коду просто для відкриття та запису файлу. Це просто не правильно.
h22
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.