Пітон проти FORTRAN


17

Що краще: FORTRAN чи Python? І я здогадуюсь, що в обох випадках вам потрібен Gnuplot, я прав?

Зараз я працюю на машині Windows.

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

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

Також які компілятори ви б рекомендували?

Основне питання для мене зводиться до: який найпростіший у вивченні, який найшвидший, який найзручніший і перш за все той, який найбільше використовується (так порівняння цих 4)? А поруч із цим, які найпоширеніші (безкоштовні чи платні) компілятори використовуються? Я зараз розглядаю можливість перетворення старого ноутбука (раннього двоядерного Intel) в Linux; сподіваємось, це досить швидко.

Дякую за відповіді поки що! Відповіді, які відповідають тому, що я шукаю, - це відповіді LKlevin та SAAD.

Я знаю основи C ++, Maple і я майже повністю освоюю MATLAB та Mathematica9, якщо це допоможе.


12
Вам справді потрібно бути більш конкретним; це як запитати "що краще: молоток чи викрутка?". Погляньте на scicomp.stackexchange.com/questions/11006 (мова йде про C ++ замість Fortran, але більшість балів повинні застосовуватися однаково).
Крістіан Класон

@ChristianClason, справедливий пункт: p
Нік

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

2
Також питання про компілятори є окремим питанням і має бути окремим питанням. (Інакше люди, знайомі з Fortran, але не зацікавлені в Python, не побачать цього.) Деякі рекомендації вже наведені в scicomp.stackexchange.com/questions/8617 .
Крістіан Класон

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

Відповіді:


29

Простота навчання

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

Я вважаю, що перехід від Python до Fortran був би простішим. Python - це інтерпретована мова, тому кількість кроків, які потрібно виконати для запуску першої програми, менша (відкрийте інтерпретатор, введіть print("Hello, world!")підказку), ніж для Fortran (напишіть програму "Hello world", компілюйте, запустіть). Я також думаю, що в Python є кращі матеріали для викладання об'єктно-орієнтованого стилю, ніж у Fortran, і на GitHub доступно більше Python-коду, ніж код Fortran.

Початок роботи та роботи в Windows

Встановлення Python має бути менш болісним; доступні дистрибутиви Windows. Я рекомендую використовувати такий науковий дистрибутив, як Анаконда або Барабанний навіс. Компілятор насправді насправді не є; перекладач бере цю роль. Ви хочете використовувати інтерпретатор на основі CPython, оскільки є більше числових бібліотек, і він добре взаємодіє з C, C ++ та Fortran. Інші реалізації інтерпретатора включають Jython та PyPy.

На машині Windows установка компілятора Fortran буде дратувати. Типовими компіляторами командного рядка є такі програми, як gfortran, ifort (від Intel; безкоштовно для особистого використання, інакше коштує гроші) та pgfortran (від PGI; безкоштовні пробні версії, інакше коштують гроші). Щоб встановити ці компілятори, можливо, вам доведеться встановити якийсь шар сумісності типу UNIX / POSIX, наприклад Cygwin або MinGW. Я вважав болем працювати, але деяким людям подобається цей робочий процес. Ви також можете встановити компілятор з графічним інтерфейсом, наприклад, Visual Fortran (знову ж, вам доведеться заплатити за ліцензію).

В Linux буде простіше встановити Python та компілятори; Я б все-таки встановив Anaconda або Enthought Canopy як дистрибутив Python.

Швидкість: компроміс продуктивності та продуктивності

Використовуючи Python (або MATLAB, Mathematica, Maple або будь-яку інтерпретовану мову), ви відмовляєтесь від продуктивності. Порівняно з Fortran (або C ++, C або будь-якою іншою складеною мовою), ви будете писати менше рядків коду для виконання того ж завдання, що, як правило, означає, що вам знадобиться менше часу, щоб отримати робоче рішення.

Ефективне покарання за ефективність використання Python варіюється та зменшується шляхом делегування обчислювально інтенсивних завдань на компільовані мови. MATLAB робить щось подібне. Коли ви робите множення матриць у MATLAB, він викликає BLAS; штрафний показник практично дорівнює нулю, і вам не довелося писати жодних Fortran, C або C ++, щоб отримати високу продуктивність. Схожа ситуація існує і в Python. Якщо ви можете використовувати бібліотеки (наприклад, NumPy, SciPy, petsc4py, dolfin від FEniCS, PyClaw), ви можете написати весь свій код у Python і отримати хороші показники (пеня, можливо, 10-40%), оскільки всі обчислювальні Інтенсивні частини - це дзвінки до швидко складених мовних бібліотек. Однак якби ви писали все на чистому Python, покарання за продуктивність було б коефіцієнтом 100-1000x. Тож якщо ви хочете використовувати Python і повинні були включити користувальницький, обчислювально обчислювальна рутина, вам було б краще написати цю частину мовою, складеною на зразок C, C ++ або Fortran, а потім обернути її інтерфейсом Python. Є бібліотеки, які полегшують цей процес (наприклад, Cython та f2py), і навчальні посібники, які допоможуть вам; це, як правило, не обтяжливо.

Сфера використання

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

У галузі обчислювальної техніки Python, як правило, не конкурує безпосередньо зі складеними мовами через пені, які я згадав. Ви б використовували Python у випадках, коли ви хочете, щоб висока продуктивність і продуктивність були вторинними питаннями, наприклад, при прототипуванні чисельно інтенсивних алгоритмів, обробці даних та візуалізації. Ви б використовували Fortran (або іншу мову, що склалася), коли ви добре розумієте, яким повинен бути ваш алгоритм та дизайн додатків, ви готові витратити більше часу на написання та налагодження свого коду, а продуктивність є першорядною. (Наприклад, продуктивність є обмежуючим кроком у вашому процесі моделювання, або він є ключовим результатом у ваших дослідженнях. Загальна стратегія - змішати Python та мову компіляції (зазвичай це використовується C або C ++, але також використовується Fortran), і використовувати лише скомпільовану мову для найбільш чутливих до продуктивності частин коду; вартість розробки полягає, звичайно, у тому, що складніше написати та налагодити програму двома мовами, ніж програму на одній мові.

З точки зору паралелізму, чинний стандарт MPI (MPI-3) має вроджені прив’язки Fortran і C. Стандарт MPI-2 мав вбудовані C ++ прив’язки, але MPI-3 не має, і вам доведеться використовувати зв'язки C. Існують сторонні MPI прив’язки, такі як mpi4py. Я використав mpi4py; він добре працює і простий у використанні. Для великомасштабного паралелізму (десятки тисяч ядер) ви, мабуть, захочете скористатися складеною мовою, тому що такі речі, як динамічне завантаження модулів Python, будуть кусати вас в дупу в масштабі, якщо ви будете робити це наївно. Існують способи обійти це вузьке місце, як показали розробники PyClaw, але цього простіше уникнути.

Особиста думка

Я маю приблизно десятиліття досвіду роботи у Fortran 90/95, а також програмував у Fortran 2003. У мене є приблизно п'ять років досвіду програмування в Python. Я використовую Python набагато більше, ніж я використовую Fortran, тому що, чесно кажучи, я більше роблю в Python. Більшість робіт, які мені потрібно виконати, не потребують великих суперкомп'ютерних ресурсів і, як правило, не варто переробляти іншою мовою, тому Python просто чудово вирішує ODE та PDE. Якщо мені потрібно використовувати компільовану мову, я буду використовувати в цьому порядку C, C ++ або Fortran.

Більшість коду Fortran, які я бачив, були некрасивими, головним чином тому, що більшість спільнот з обчислювальних наук, здається, не знають або не проти будь-яких найкращих практик, виявлених інженерами програмного забезпечення за останні 30 років. На кшталт: у Фортрана немає хорошої рамки тестування одиниць. (Найкраще, на що я стикався, - це FUnit, NASA, і це вже не підтримується.) Є кілька хороших рамок тестування модулів Python, хороші генератори документації Python і, як правило, багато кращих прикладів хороших практик програмування.


Дуже приємна і повна відповідь :). Я вчора встановив Linux там, де вже був присутній компілятор python. Тепер мені було цікаво, чи є простий спосіб спільного використання файлів між моєю машиною Linux та Windows? Я помітив, що щоразу, коли я використовую паличку для передачі даних, і Windows, і Linux машина ігнорує певні частини на стилі (який відформатований у форматі NFTS).
Нік

і моє останнє питання вирішується bij, використовуючи формат FAT32 (По крайней мере, поки що).
Нік

Примітка: FAT32 має обмежений максимальний розмір файлу.
meawoppl

@Meawoppl, чи є більш зручний спосіб обміну файлами між Linux та Windows? Може, тоді випадок? Чи є також апаратне рішення?
Нік

Зберігайте ваші файли менше 4 Гб: P Дійсно, я не знаю хорошого рішення. Існує також деяка дербистість у конвенціях імен файлів. Я пам'ятаю, як один раз зламав підтримку Windows, назвавши файл <3.txt, що зробило M $ досить сумним обличчям. Підтримка NTFS в Linux є досить хорошою, але це, по суті, загальна відсутність OSX. Я дійсно думав, що ми вже вирішили цю проблему.
meawoppl

7

Я б тримався подалі від Фортана, або, якщо потрібно, використовувати досить нову версію (2003, а не 77). Багато програмного забезпечення з фізики (зокрема моделювання Монте-Карло) написано у Фортран, просто тому, що проекти спочатку були започатковані у 80-х.

Як сказано, python і Fortran - це дві дуже різні мови, і те, для чого їх слід використовувати, зовсім інше. Python - це високий рівень і взагалі не такий швидкий (порівняно з Fortran & C ++). Причина, по якій його так багато використовують, полягає в тому, що він досить швидкий для більшості речей і має чудові бібліотеки (що працюють на Fortran) для багатьох (але не всіх) речей, які ви хотіли б зробити. Він також має чудовий Matplotlib для побудови графіків (тому немає потреби в GNUplot), і ви можете отримати цілком пристойну продуктивність, використовуючи такі речі, як Cython, для написання дорогих біт. Однак це буде не так швидко, як Fortran або C ++, але паралелізація є досить жахливою, що робить її неадекватною для чисельних обчислень високої продуктивності. Якщо все, що ви хочете, можна вирішити, зателефонувавши до бібліотек Fortran або C,

Фортран - мова дещо нижчого рівня. Для числових даних підтримка бібліотеки напрочуд хороша, але все ще дуже низький рівень дає вам скарб помилок, яких ви могли б уникнути, наприклад, випадково передавши неправильний розмір масиву методу. Ці помилки важко знайти, і ви можете їх зовсім не помітити. Повірте, я витратив досить довгий час на написання Fortran 77.

C ++ є (на мою скромну думку) щасливим середовищем. З такими бібліотеками, як Armadillo або Eigen, ви можете піти з досить високого рівня стилю кодування, отримуючи при цьому стиль виконання низького рівня.

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

Для Fortran на windows все стає дещо складніше. Я рекомендую перейти на Linux та використовувати компрелятор gfortran або Intel ifort. На моєму досвіді Ifort, як правило, швидше для цифрового коду, але є вільним лише для некомерційного, неакадемічного використання.

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

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

Відмова: Я фізик, який досить багато часу проводив з кодами Монте-Карло на базі Fortran 77 і в даний час виконує всю обробку своїх даних в Python.


Щодо паралелізації, то дослідники успішно використовували Python паралельно на десятках тисяч ядер з хорошою паралельною ефективністю. (Наприклад, PyClaw був запущений на всій Shaheen, що становить 65 000+ ядер.)
Джефф Оксберрі

1
Ну можливо, але, наскільки мені відомо, лише переконавшись, що паралельна частина відбувається поза CPython, що є значним зусиллям. Паралельна частина PyClaw (PETSc) написана, наприклад, в C. Інша альтернатива - це запуску декількох екземплярів CPython, але це не зовсім банально.
Л.Клевін

Більшість паралельних додатків нетривіальні. Ви писали, що "[Python] паралелізація є досить жахливою, що робить її неадекватною для чисельних обчислень високої продуктивності". Ніхто не пише коду високої продуктивності на чистому Python. Міркування цього рішення не має нічого спільного з паралелізмом і не скасовує використання Python як мови інтерфейсу у високопродуктивних обчисленнях, якщо воно належним чином використовується. Ваша цитата - солом’яна людина, яка поєднує питання паралелізму, високої продуктивності та інтерпретованих мов; ніхто компетентний не спроектував би таке додаток.
Джефф Оксберрі

Я згоден, що Python - це чудова мова інтерфейсу практично для будь-яких цілей, але це відходить від питання. Більшість застосунків нетривіальні, проблема полягає в тому, що всі випадки паралелізації, в тому числі і тривіальні, нетривіальні в пітоні. Це може неприємно, якщо ваша проблема в іншому випадку добре описана в термінах операцій Numpy або Cython. Ні, ви б не використовували це на ядрі кластера 65000, але ви можете прийняти 2x хіт продуктивності на 100 ядра.
Л.Клевін

Паралелізм Wrt, приємна річ у Fortran полягає в тому, що крім MPI / OpenMP є також Co-масиви, які зараз є частиною стандарту. Наприклад, подивитися jolts.stanford.edu/72 / ...
Staļi

7

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

Сучасний Фортран (90 і пізніших версій) є як швидким, так і високим рівнем, майже з MATLAB, як синтаксис. Тож ви можете робити такі речі, як:

k=k+matmul(transpose(B),matmul(D,B))*weight(i)*detj

або

indx(:)=indxmap(indx(:),2)

або навіть простіше

indx=indxmap(indx,2)

тощо.

На Linux є ряд безкоштовних компіляторів Fortran. я використовую

  1. GCC
  2. Студія Solaris
  3. Open64
  4. Intel (лише для некомерційного використання)

Я не використовую Macs / OSX, але є безкоштовний PGI.

І будь ласка, не використовуйте FORTRAN 77. Ніхто не використовує його для написання нового коду.

Відмова: Я особисто дивився на Python для написання власного невеликого неструктурованого коду FE (побудований поверх PETSc), але обсяг роботи / кодування, що займається, був більшим, ніж просто написання цього простого Fortran 95.


1
До цього я додам, що ви можете робити досить серйозні об'єктно-орієнтоване програмування у Fortran 2003; див., наприклад, цей посібник . Я багато використовував його у власному коді, і це було дуже ефективно для того, що я хочу зробити. Дуже багато людей скажуть вам, щоб цього уникали - я кажу, що відкрито розумійте, вам це може сподобатися дуже. Я, звичайно, роблю.
Даніель Шаперо

4

Python дуже практичний для повного моделювання аналізу з добре задокументованими універсальними пакетами: генерація сітки, обчислення масиву та обробка структури даних ( numpy та панди ), а також візуалізація даних за допомогою matplotlib. Для складних симуляцій з великими файлами результатів ще краще працювати з пакетом VTK, який дозволяє експортувати дані для зчитування передовими програмами з відкритим кодом (наприклад, Paraview або Visit)

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

Порівняння зменшується до продуктивності : я робив обчислення великого масштабу лише за допомогою компільованих мов (C ++ та Fortran 90), але ніколи з Python. Інший потік дає більше інформації про продуктивність інтерпретованих та складених мов: Яку мову я повинен використовувати під час викладання бакалаврського курсу комп'ютерного програмування?

Особисто мені подобається взагалі працювати з Python, особливо для пост-обробки. Програмування Python - це весело!


1
Продуктивність майже завжди важлива. Недостатня увага до продуктивності полягає в тому, що людям потрібно 8 ядер з 16 Гб оперативної пам’яті для перевірки електронної пошти та веб-пошуку.
stali

У мене було нещастя змушений читати код питона інших. Я б не класифікував py-код як простий для читання.
Biswajit Banerjee

@stali: Я повністю згоден
SAAD

1
@BiswajitBanerjee: писати складний код будь-якою мовою неможливо, але, принаймні, я можу легко визначити входи та виходи будь-якої функції, ось де Fortran стає жахливим! :)
SAAD

3

З Python вам не потрібен Gnuplot, ви можете використовувати, наприклад, matplotlib та / або використовувати оболонку IPython. IPython - це інтерактивна оболонка Python, яка в режимі% pylab забезпечує майже ті самі команди побудови графіку, які є у вас в MATLAB.

Цілком ймовірно, що наукові обчислення значно розширяться від MATLAB до Python у наступні 5+ років.


Однією з переваг Gnuplot є те, що він майже завжди встановлюється на машинах Linux (кластер / сервери тощо) і дуже корисний для швидкого / брудного визи. Це як vi для viz.
stali

1

Я б продовжував використовувати MATLAB, він викликає бібліотеки швидкої математики, і ви не побачите великої різниці в продуктивності, перейшовши на FORTRAN у Windows. У той же час у вас буде краща інфраструктура в MATLAB для звітування про результати та запуску коду. Мінусом MATLAB є його вартість. FORTRAN в основному безкоштовний, і там є купа безкоштовних бібліотек.

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

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


2
Твоє твердження про відмінності в роботі при переході від MATLAB до Fortran взагалі не відповідає дійсності. Fortran чудово, якщо ви пишете код, для якого масиви є природно хорошою структурою даних, якщо ви можете жити з тим, як він обробляє введення / виведення, і якщо в ньому є потрібні вам бібліотеки. Числові бібліотеки в Python сильно перекриваються у функціональності з MATLAB, і мені легше писати інтерфейси Python в код C, ніж інтерфейси MATLAB в код C.
Джефф Оксберрі

Іноді ви дійсно бачите велику різницю. Нещодавно я переписав програму фізичного моделювання від Matlab (використовуючи пакет bvp6c внутрішньо) до Fortran 2008 (використовуючи пакет bvp_solver внутрішньо), і час виконання знизився до всього 1,4% після перемикання, хоча я не змінив алгоритми або загальну структуру програми. Для моделювання, яке вимагало ~ 3,5 дня на точку даних для сходження, це було дуже помітним поліпшенням.
jabirali
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.