Чи швидший і легший Python, ніж C ++? [зачинено]


90

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

Ця статистика мене дуже вразила.

Що ваш досвід говорить вам про час та використання пам'яті Python проти C ++?


18
Отже, у більшості випадків Pyhton працює повільніше і використовує більше оперативної пам'яті, але джерело менше. У чому саме проблема?
nuriaion

2
Здається, я неправильно інтерпретував результати.
Алекс

6
Що насправді цікаво, тести на C ++ все ще «кращі», ніж тести на C!
gbjbaanb

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

1
Посилання мертве
Арн

Відповіді:


237

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

Мій досвід роботи з Python демонструє ту саму певну тенденцію, що Python має порядок у 10-100 разів повільніший, ніж C ++, коли виконує будь-яке серйозне дроблення чисел. Цьому є багато причин, основними з яких є: а) Python інтерпретується, тоді як C ++ компілюється; б) Python не має примітивів, все, включаючи вбудовані типи (int, float тощо), є об'єктами; в) список Python може містити об’єкти різного типу, тому кожен запис повинен зберігати додаткові дані про свій тип. Це все суттєво заважає виконанню та споживанню пам'яті.

Це не причина ігнорувати Python. Багато програмного забезпечення не вимагає багато часу або пам’яті, навіть з коефіцієнтом повільності 100. Вартість розробки - це те, де Python виграє у простому та стислому стилі. Це покращення вартості розробки часто перевищує вартість додаткових процесорів та ресурсів пам'яті. Однак, якщо цього не відбувається, тоді перемагає С ++.


108
Крім того, люди, які говорять про те, що Python повільний для серйозного зминання чисел, не використовували модулі Numpy та Scipy. У наші дні Python справді починає розвиватися в наукових обчисленнях. Звичайно, швидкість походить від використання модулів, написаних на C, або бібліотек, написаних на Fortran, але в цьому полягає краса мов сценаріїв, на мій погляд.
Джастін Піл

3
Переконуюсь, що ви сказали, і це посилання на підтвердження цього: blog.dhananjaynene.com/2008/07/…
ucefkh

2
Щодо: c) список Python може містити об’єкти різного типу, тому кожен запис повинен зберігати додаткові дані про свій тип. Список python - це насправді список покажчиків на об'єкти. У python це значення знає його тип, тоді як змінна є лише покажчиком на "об'єкт загального значення" (тому парні числа незмінні). Отже, списки не зберігають типи вмісту, а лише вказівники. Ви маєте рацію щодо накладних витрат на пам'ять - python повинен зберігати тип та інший контекст для значень будь-якого типу.
Олексій

якщо ви говорите про cpython .. тоді так, але pypy в більшості випадків дуже швидкий (порівняно з java, 1/3 швидкість Java, я думаю), підмножини python колись майже такі ж швидкі, як c ++ (див. shedskin)
Quonux

1
@JustinPeel я сумніваюся, чи це правда. навіть при широкому використанні numpyта scipy, велика pythonбаза коду, ймовірно, матиме багато коду в чистому python, що робить справи повільнішими за C++. сценарій python наближається до швидкості C++сценарію, оскільки відсоток його Cкоду переходить 100, і в цей момент він більше не є сценарієм python. python, звичайно, злітає, але не тому, що він такий же швидкий, як C++- тому що він простіший у використанні.
dbliss

132

Усі найповільніші (> 100 разів) використання Python у перестрілці - це наукові операції, що вимагають великого числа GFlop / s. В будь-якому разі НЕ слід використовувати python для них. Правильний спосіб використання python - це імпортувати модуль, який виконує ці обчислення, а потім провести спокійний полудень зі своєю сім’єю. Це пітонічний спосіб :)


3
На сьогоднішній день існує кілька компіляторів Python-to-C ++ , тому в деяких випадках Python може бути швидким, ніж C ++.
Андерсон Грін,

26

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

Яке ваше питання?


Мене просто бентежили результати тестів. Виявляється, я неправильно їх інтерпретував.
Алекс

16

Розмір джерела насправді не є розумною річчю для вимірювання. Наприклад, такий сценарій оболонки:

cat foobar

набагато коротший, ніж його еквіваленти Python або C ++.


35
І набагато простіше підтримувати, що довші версії Python або C ++ теж. Я стверджую, що розмір вихідного коду має значення, і для певних простих завдань гарні короткі сценарії оболонки.
S.Lott

Я також вважаю, що розмір вихідного коду має велике значення, і для деяких завдань Bash є правильним інструментом для роботи. Дивіться хороший приклад порівняння простого скрипта bash з python тут: innolitics.com/articles/programming-languages/… (вам потрібно трохи прокрутити вниз). Я думаю, що це трохи більш витончений приклад, ніж cat footer.
jdg

7

Також: Psyco проти C ++ .

Це все ще погане порівняння, оскільки ніхто б не робив тести на кількість хрустких речей, як правило, орієнтуються на чистий Python. Кращим буде порівняння продуктивності реалістичних програм або C ++ проти NumPy, щоб отримати уявлення про те, чи буде ваша програма помітно повільнішою.


2
іншими словами - оскільки numbercrunchy речі набагато повільніше, напишіть це на C ++ і зателефонуйте з Python :-)
igouy

1
Якщо ви збираєтеся використовувати бібліотеку в python, щоб зробити це швидше, тоді ви також можете скористатися бібліотекою, що хрустить в c ++. Таким чином ви зберігаєте гнучкість c ++ без необхідності писати купу коду :)
SuperSim135

Це бог-ярус безглуздо некро. OP буквально заявляє, що віддає перевагу Python для читабельності та зручності, чому хтось безпосередньо користується мовою, яка їм подобається менше, коли вони можуть отримати більшу частину переваг від продуктивності, якщо автори бібліотек піклуються про них? Сенс використання бібліотек не полягає в тому, щоб робити таку роботу, яку вони роблять краще, самостійно, а те, що бібліотека є власним прив'язуванням, є деталлю оптимізації / реалізації.
milimoose

6

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

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

С ++ не призначений для швидкої розробки додатків і успадковує спадщину швидкості від С - для програмування на низькому рівні.


3

Це та сама проблема з керованою та простою у використанні мовою програмування, як завжди - вони повільні (а іноді і поглинають пам’ять).

Це мови для контролю, а не обробки. Якби мені довелося писати програму для перетворення зображень і мені довелося б використовувати Python, вся обробка могла б бути записана на C ++ і підключена до Python через прив'язки, тоді як управління інтерфейсом і процесом було б визначено Python.


Ці бібліотеки вже написані для Python або C або Java, то чому б не використовувати динамічну мову для їх склеювання?
aoeu256

2

Я думаю, що ця статистика показує, що Python працює набагато повільніше і використовує більше пам'яті для цих тестів - ви впевнені, що читаєте їх правильно?

З мого досвіду, який здебільшого пов’язаний із написанням програм на Python, пов’язаних із мережею та файловою системою, Python не значно повільніший у будь-якому важливому випадку. Для такої роботи вигоди перевищують витрати.


Справді. Коли продуктивність є проблемою, те, в чому пітон хороший, - це зв’язування між собою високопродуктивних зовнішніх модулів або прототипування системи, а потім дозволяє переписати вузькі місця (як правило, у внутрішній цикл) як модуль C тощо
xan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.