Чому Python використовується для високоефективних / наукових обчислень (але Ruby це не так)?


106

Є цитата з розмови про PyCon 2011, яка йде:

Принаймні, в нашому магазині (Національна лабораторія Аргонна) у нас є три прийняті мови для наукових обчислень. У такому порядку вони є C / C ++, Fortran у всіх його діалектах та Python. Ви помітите абсолютний і повний брак Ruby, Perl, Java.

Це було в більш загальному контексті високоефективних обчислень. Цитата надана лише з одного магазину, але ще одне питання щодо мов для HPC також Python перераховує як вивчати (а не Ruby).

Тепер я можу зрозуміти, що C / C ++ і Fortran використовуються в цьому проблемному просторі (і Perl / Java не використовується). Але я здивований, що буде велика різниця у використанні Python та Ruby для HPC, враховуючи, що вони досить схожі. (Примітка - я фанат Python, але проти Рубі нічого не маю ).

Чи є якась конкретна причина, чому одна мова знялася? Чи про бібліотеки доступні? Якісь особливості мови? Спільнота? Чи, може, просто історична суміжність , і це могло піти іншим шляхом?


2
Я б припустив, що хоча вони обидві динамічні мови, Python та Ruby досить різні. Більш різний, ніж подібний.
Адам Кросленд

20
Я не знаю, що це відповідь, але - пам’ятайте, що Пітон мав більше «тяги», перш ніж Рубі вилетів за межі невеликої спільноти з Рейлами (близько 2005-2006). Google деякий час використовував Python, що підвищило його профіль (на початку 2000-х). Синтаксис Python зрозумілий і легкий для вивчення та читання (і пам’ятайте, це було в епоху, коли Perl був насправді єдиним іншим головним варіантом), тому я думаю, що це дійсно підштовхнуло наукові обчислення до цього. Після цього це було, ймовірно, самоусиленням, оскільки люди створювали NumPy / SciPy, MatPlotLib та багато інших наукових обчислювальних пакетів.
wkl

4
Люди, які цікавляться цим питанням, мені також цікаво перевірити сайт обміну стеками Computational Science .
Марк Бут

2
"кількість читабельності"
jsbueno

1
Щоб запропонувати деяку перспективу обчислювальної хімії, тривіально паралелізувати обчислення з Python, і дешево теж. Можливо, це обоє вірно і в Рубі. Не знаю.
Джонатан Ландрум

Відповіді:


108

Я розширю на свій коментар.

Я думаю, що є кілька факторів, які вплинули на використання Python в наукових обчисленнях, хоча я не думаю, що існують певні історичні моменти, де можна сказати: "Так, це причина, чому Python використовується над Ruby / будь-чим іншим" "

Рання історія

Python і Ruby мають приблизно однаковий вік - за даними Вікіпедії, Python був офіційно вперше випущений у 1991 році, а Ruby в 1995 році.

Однак Python став відомішим раніше, ніж це робив Рубі, оскільки Google вже використовував Python і шукав розробників Python на зламі тисячоліття. Оскільки це не так, як у нас є кураторна історія використання мов програмування та їх впливу на людей, які ними користуються, я вважаю, що це раннє прийняття Python від Google було великим мотиватором для людей, які прагнуть розширитись за межі просто використання Matlab, C ++, Fortran, Stata, Mathematica тощо.

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

Злиття подій

Наукові обчислення використовувались на спеціальних машинах, таких як SGI та Crays (пам’ятаєте їх?), І звичайно, FORTRAN широко використовувався завдяки відносній простоті та тому, що його можна було оптимізувати легше.

В останнє десятиліття або близько того товарне обладнання (тобто речі, які ви або я можу собі дозволити, не будучи мільйонерами), перейняло наукову та масову сферу обчислень. Подивіться на поточний рейтинг у топ-500 - багато топ-суперкомп'ютерів у світі побудовані з нормальним обладнанням Intel / AMD.

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

Плюс до того, якщо зануритися в старі наукові статті з обчислень, вони почали виходити біля 2000-х років.

Рання підтримка

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

У статті є ця цитата про Python:

Python - інтерпретована об'єктно-орієнтована мова програмування, яка починає привертати значну увагу в наукових програмах (Python, 1999). Це тому, що Python та мови сценаріїв загалом є наступним логічним кроком для багатьох наукових проектів (Dubois 1994). По-перше, Python пропонує інтерпретовану мову програмування, яку можна розглядати як розширення простих мов команд, які вже використовуються науковими програмами

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

Таким чином, ви можете бачити, що Python вже мав тягу, яка починається з кінця 90-х, завдяки тому, що він був функціонально схожий на існуючі на той час системи, а також тому, що було легко інтегрувати Python з такими речами, як C та існуючі програми. Виходячи зі змісту статті, Python вже був у науковому використанні, починаючи з часових рамків 1995-1996 років.

Різниця в зростанні популярності

Популярність Рубі вибухнула разом із підйомом Ruby On Rails, який вперше з'явився в 2004 році. Я був у коледжі, коли вперше почув галас про Рубі, і це було близько 2005-2006 років. django для Python було випущено приблизно в той самий термін (липень 2005 року за версією Wiki), але фокус спільноти Ruby здавався дуже сильно зосередженим на просуванні його використання у веб-додатках.

У Python, з іншого боку, вже були бібліотеки, які підходили для наукових обчислень:

  • NumPy - NumPy офіційно розпочався в 2005 році, але дві бібліотеки, на яких він був побудований, були випущені раніше: Numeric (1995) і Numarray (2001?)

  • BioPython - бібліотека біологічних обчислень для пітона, щонайменше, відноситься до 2001 року

  • SAGE - Пакет Math з першим публічним випуском на початку 2005 року

І багато іншого, хоча я не знаю багатьох їх часових ліній (крім просто перегляду їх сайтів для завантаження), але Python також має SciPy (побудований на NumPy, випущений у 2006 році), мав зв'язки з R (мова статистики) в на початку 2000-х, отримав MatPlotLib, а також отримав дійсно потужне середовище оболонки в ipython.

ipython був вперше випущений на початку 2000-х, і до нього було додано багато особливостей, які роблять його дуже приємним для наукових обчислень, як інтегрований графік matplotlib та можливість керувати обчислювальними кластерами .

Зверху стаття:

Також варто відзначити ряд інших науково-обчислювальних проектів Python. Числове розширення Python додає маніпуляції з швидким масивом та матрицею до Python (Dubois 1996), MMTK - це набір інструментів для молекулярного моделювання на основі Python (Hinsen 1999). і візуалізаційний інструментарій (VTK) - це вдосконалений пакет візуалізації з прив’язками Python (VTK, 1999). Крім того, поточні проекти в спільноті Python розробляють розширення для обробки зображень та побудови графіків. Нарешті, робота, представлена ​​в (Greenfield, 2000), описує використання Python в проектах STScI.

Хороший список наукових та числових пакетів для Python .


Так багато цього, мабуть, пов’язано з ранньою історією та відносною невідомістю Рубі до 2000-х років, тоді як Python отримав тягу завдяки євангелізації Google.

Отже, якщо ви оцінювали мови сценаріїв у період з 1995 по 2000 роки, на що ви насправді дивилися? Був Perl, який, ймовірно, був досить синтаксичний, що люди не хотіли ним користуватися, а потім з'явився Python, який мав чіткіший синтаксис і кращу читабельність.

І так, напевно, є дуже багато підкріплення - Python вже має всі ці великі, корисні бібліотеки для наукових обчислень, тоді як у Рубі голос меншості виступає за його використання в науці, і деякі бібліотеки проростають, як SciRuby , але Інструменти Python дозріли за останнє десятиліття.

Спільнота Рубі взагалі набагато сильніше зацікавлена ​​у наданні Рубі як веб-мови, оскільки саме це насправді стало добре відомим, тоді як Python почав інший шлях, а згодом широко використовувався як веб-мова.


8
Я забув трохи про інтеграцію c. У багатьох випадках науковий розрахунок обчислювально інтенсивний, і вміння писати рутину змінного струму саме на цей біт є важливою перевагою.
Спенсер Ратбун

1
@SpencerRathbun У статті, яку я пов’язував, згадується використання Python із SWIG для створення обгортки та дозволу Python взаємодіти з кодом C / C ++. SWIG не отримав офіційну підтримку Ruby до Ruby 1.6, який був випущений у 2004 році. Таким чином, Python вже мав головний початок, маючи на увазі частку та інструменти навколо нього, що підходили для того, щоб люди могли зафіксувати Python у своїх існуючих системах. Не доведеться виривати весь існуючий, оптимізований код FORTRAN / C, який використовувався, був, мабуть, найбільшим рушієм.
wkl

3
У 1991 році ми використовували TCL, щоб з'єднати чисельні бібліотеки як спосіб аналізу даних без необхідності запису маси C / Fortran. Python прийшов у потрібний час, щоб замінити TCL. Простота взаємодії з "C" (і F2C з fortran) була великою справою порівняно з PERL, інтерфейс TCL до "C" був дуже легким
Мартін Беккет

Процеси переважного додавання пояснює дуже багато про те, які мови використовуються. Це Зіпфіан! Дивіться міатію Zipf "PAP", пояснюючи її о 12:50.
radarbob

37

Я широко використовував Python для інженерних програм та Ruby для веб-додатків.

Проблема, яку я бачу з Рубі як науковою мовою, полягає в тому, що занадто багато варіантів синтаксису для даної операції.

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

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


3
Так, справді. Рубі - традиція TIMTOWTDI, а тому просто трохи краща Perl. Програмне забезпечення написане для програмістів. Укладачі / перекладачі є в цьому сенсі вторинною аудиторією. Вчені, як правило, серйозно ставляться до того, щоб виконати свою роботу без надмірного втручання з боку надмірно складного програмного забезпечення. QED
Домінік Кронін

4
Не впевнений, що я слідую за цим аргументом. Якщо програміст, а не машина, є основною аудиторією, бувають випадки, коли формулювання речей по-різному покращує ясність і підкреслює наміри. Чи не допомагає більш гнучка мова зрозуміти наші м'які людські мізки?
Ендрю Віт

10
Але і C може виглядати як вибух на фабриці ASCII. Нагадаємо, що в C масив - це шкіра навколо вказівників. Отже, масив [5] може бути записаний як * (масив + 5), який альтернативно може бути записаний як * (5 + масив), який альтернативно може бути записаний як 5 [масив]. Що дурне.
Джонатан Ландрум

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

@AndrewVit: Не обов’язково. TIMTOWTDI чудово працює, якщо у вас є один розробник або якщо у вас невелика, тісно інтегрована команда розробників. Але як тільки у вас є люди , які ніколи не зустрічалися працювати на тому ж коді, що ви збираєтеся почати питати себе : «О, чому вони роблять це , що шлях?» Або, альтернативно, ви напишете посібник зі стилів, щоб змусити всіх робити це так само, і тоді ви вже не робите TIMTOWTDI.
Кевін

17

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

По-друге, відповідно до Ruby FAQ , python орієнтований як на процедуру, так і на об'єкт, тоді як рубін маскується як процедурна мова. Якщо ви пишете невеликий сценарій для математичних цілей, як, наприклад, те, що ви робили в matlab, парадигма OO - це головний біль. Мало того, але це змушує концептуальний стрибок від функціональних / процедурних парадигм, якими користуються дослідники. Математика - це не ОО. Математика функціональна, їй слід процедурно (думаю, логічні докази).

Нарешті, зауважте, що у Ruby FAQ задано, що рубін складніший за python. Програмування займає друге місце для дослідників, не перших, як ми.


22
Я думаю, що справа в ОО є трохи червона оселедець. Що цікавить дослідника, чи вираз 1 + 1передає повідомлення +об’єкту 1? Це не змінює структури вашої програми ні в найменшій мірі.
sepp2k

1
@ sepp2k, я думаю, що Спенсер припускає, що Рубі вимагатиме від вчених програмувати інакше. Я не знаю Рубі, але припустимо, що вам довелося створювати об'єкти, щоб написати програму в Ruby, тоді як Python дозволяє процедури - це додасть ментальних витрат. За умови, що не багато, але для непрограміста, кожен шматочок додаткової роботи був би приводом для використання іншої мови.
Циклопи

7
@Cyclops Я отримую те, що він пропонує. Я кажу, що це неправильно. Вся суть цитати про рубінову маскування як процедурну мову полягає в тому, що вам не потрібно структурувати свою програму об'єктно орієнтованим способом. Якщо ви вводите щось на кшталт "2 + 2", ви створюєте два об'єкти Integer і викликаєте метод на одному (передаючи інший як аргумент). Однак, якщо не вводити "2 + 2" в рубіні, потрібно більше зусиль, ніж введення "2 + 2" іншими мовами.
sepp2k

5
Я з sepp2k, я також не купую цей аргумент. Деякі мови, як-от Java, змушують парадигму ОО на вас - не так, як з Рубі. Що вас заважає писати суто процедурну чи функціональну програму в Ruby?
Майк Баранчак

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

14

Коли BDFL (Guido van Rossum) вперше написав Python, мета полягала в тому, щоб вона була такою ж зрозумілою, як і звичайна англійська (пропозиція щодо фінансування DARPA), що дозволило б усунути поширені помилки кодування.

Одне з питань, яке є дуже помітним, - це використання відступу для розміження блоків. У мовах, які мають явні складні роздільники виразів (наприклад, дужки C, Pascal BEGIN / END), пробіл буде згортатися до єдиного символу пробілу перед подачею коду в лексеру. Це дозволило б сильно змінити спосіб викладення коду.

Для професійних програмістів це не проблема, оскільки вони навчилися цим займатися з 30 і більше годин на тиждень практики.

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

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

Це єдиний приклад того, чому він популярний поза професією програмування. Є й інші приклади, які можуть бути використані для того, щоб проілюструвати ту саму точку, як батареї, дзен з Python ( import this), використання гумору Monty Python тощо.


Я не можу знайти жодної згадки про дисертацію чи докторську програму у списку резюме чи публікацій Гідо . У вас є цитування на це? Це інтерв'ю просто говорить про те, що він був дослідником CWI.
М. Дадлі

Я повністю заплутався з цього приводу: я читав, що він робив дисертацію з цього приводу, але не робив належних досліджень з цього приводу. Я виявив свою помилку після того, як написав цю публікацію, але потім ніколи не вносив виправлення. Дякую.
Ленс Хельстен

5

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

  • Рубін може бути інтуїтивніше кодований, ніж python (DSL тощо): надано правильні пакети, які використовуються:

    перевірити bioruby: http://bioruby.org/ резерв послідовностей може бути просто: s.reverse тощо, якщо ви використовуєте бази даних: API прив'язки бази даних ruby, можливо, краще, ніж python.

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

  • краща система управління пакунками: рубінові дорогоцінні камені настільки простіші порівняно з: setuptools, pip тощо

Однак прийняття рубіну було / є / буде заважати його складності. Я думаю, що Лісп - це чудова / потужна мова, але чому вона не вийшла як загальна мова? подібна ситуація тут і з рубіном - він успадковує багато сил від ляска, малої розмови та перла !: але лише підбір людей насправді використовуватиме її для отримання переваг. Зрештою, він може залишатися сильним у певних нішах / спеціальних областях (наприклад, залізниця в Інтернеті, маріонеткова конфігурація). Непрограмістам це важко сподобатись, але це може бути добрим другом програміста (побачив якийськомп'ютер вчені користуються мовою: http://www.cleveralgorithms.com/nature-inspired/index.html )

Деякі останні оновлення: схоже, пітон вже переймає пейзаж. Нещодавно такі книги, як: http://www.amazon.com/Python-Data-Analysis-Wes-McKinney/dp/1449319793 та багато інших книг (аналіз даних, машинне навчання тощо), всі написані з python як мови, що використовується . Якщо рубін хоче наздогнати, для цього потрібні серйозні зусилля. Враховуючи matplotlib в python, можливо, кілька років людини, щоб отримати його до стану, де він зараз знаходиться. Якщо не будуть докладені серйозні зусилля в рубіні, воно, ймовірно, не може наздогнати етап аналізу даних / наукових обчислень пітона в найближчі 2-3 роки.


3

Після деякого використання python для аналізу даних (виходячи з досвіду роботи з ruby, lua та R), пакет numpy (та багато пов'язаних з ним наукових бібліотек) дає можливість "швидко" обчислювати (швидкість, схожа на C, як numpy написано / інтегровано з кодами С) з легкістю програмування в python.

Numpy існує деякий час, його наявність допомогла побудувати багато інших пов'язаних наукових пакетів, таких як scipy, панди ... і т.д. Щойно розробляється бібліотека обчислень (NMtrix: https://github.com/SciRuby/nmatrix ). Ця величезна різниця в часі робить пітона очевидним вибором для наукових обчислень.


5
"врешті-решт, python - це як у всіх", вам потрібно надати джерело, щоб підтвердити це.
Вальтер

2

Мені це було цікаво. Я думаю, що це, як сказав Спенсер Ратбун, через процедурний аспект Python. Будучи самим "непрограмістом", я вважаю прекрасним те, як ви можете кодувати в Ruby, і рамка Rails є відмінною для простоти використання. Однак, кодуючи в наукових цілях (математику, біологію тощо), ти зазвичай думаєш "математичною" мовою, тобто тебе не цікавлять такі твердження, як

Person.find_by_name 'Juanito'

але вас більше хвилює

A = B*C + D

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


0

Python має кращу підтримку N-мірних масивів з пакетом Numpy. Я не бачив нічого подібного для Рубі.

Здається, Python виявляється швидшим у чисельних / наукових обчисленнях, які я зробив. У мене немає інших доказів, ніж коли я писав подібні алгоритми в Python та Ruby, алгоритми Python бігали швидше (YMMV).


2
Це насправді не дуже сприяє дискусії. Ефективність Numpy вже висвітлена (більш детально) у прийнятій відповіді . Ваш аргумент ефективності залишається непереконливим; Мені не подобається покладатися на анекдоти, коли обговорюються історичні показники, особливо коли будь-які такі аргументи, ймовірно, вже добре покриті надійними (ну, більш надійними, ніж анекдот без контексту).
Брайан

@Brian, погодився.
Джош Петтіт

@Brian, моїм конкретним внеском став коментар до N-мірних масивів. Це серцевина того, що Numpy побудований навколо, так, але я не бачив жодної згадки про ND-масиви. Це серцевина лінійної алгебри і те, що добре справляється Матлаб і Нумі. Ruby використовує масиви, як програмісти використовують масиви, не як інженери, а вчені використовують масиви (тобто матрицю). Якщо ви думаєте, що це допоможе, я додати коментар щодо ND-масивів до прийнятої відповіді.
Джош Петтіт

@Brian, і я до сих пір залишаюсь за свій коментар, що я не бачив гарної підтримки ND масиву для Ruby для наукових обчислень.
Джош Петтіт

0

Однією з причин є те, що Python має гарну підтримку використання / інтеграції / виклику коду C / C ++, тоді як, наскільки мені відомо, Ruby не пропонує такої ж ступеня (простоти) інтеграції. Це означає, що ви можете записати високоефективні компоненти коду в C / C ++, а потім використовувати Python (тобто мову високого рівня / простіший на очі), щоб склеїти все разом. Я гадаю, що це також одна з причин його раннього інституційного прийняття Google.


0

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

У мене є досвід пошуку мови перекладача з цією функцією близько 15 років тому. У той час Python був обраний не тим, що це ідеальна мова для наукових даних, а тому, що це була рідкісна мова OOP з швидким / портативним інтерпретатором, яка також була розширювана для взаємодії з іншими мовами, такими як C / C ++ / Java. На відміну від нині, вони були чудовими, але рідкісними можливостями для прямого побудови рішень із базового коду, вже реалізованого для наукових даних.

Час може бути ще одним важливим фактором для формування мови наукових даних. 15 років тому ми виявили, що в Python вже існували базові пакети, такі як числовий та scipy для чисельних обчислень, але ми навіть не знали про існування Ruby як мови програмування. Станом на кінець 2018 року я міг знайти кілька проектів із використанням Ruby для наукових даних. Можливо, через 10 років можна запитати, чому Рубі настільки популярна для ШІ.

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