Питон против Фортрана

17

Какой из них лучше: Фортран или Питон? И я думаю, что в обоих случаях вам нужен Gnuplot, я прав?

Я сейчас работаю на машине с Windows.

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

Я видел курс по вычислительной физике, который знакомит как с Фортраном (как мне кажется, 77) и с Питоном. Я планирую начать с одного, а затем изучить другой, но я не знаю, какой переход может быть самым легким.

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

Основной вопрос для меня сводится к тому, какой из них легче всего выучить, какой из них самый быстрый, какой наиболее удобный и, прежде всего, какой наиболее часто используется (так что сравнение этих 4)? И, кроме того, какие самые распространенные (бесплатные или платные) компиляторы используются? В настоящее время я рассматриваю возможность преобразования старого ноутбука (раннее двухъядерное Intel) в Linux; надеюсь, это достаточно быстро.

Большое спасибо за ответы до сих пор! Ответы, которые соответствуют тому, что я ищу, - это ответы Л.Клевина и SAAD.

Я знаю основы C ++, Maple, и я почти полностью владею MATLAB и Mathematica9, если это поможет.

Ник
источник
12
Вам действительно нужно быть более конкретным; это все равно что спросить «что лучше: молоток или отвертка?». Взгляните на scicomp.stackexchange.com/questions/11006 (речь идет о С ++, а не о Фортране, но большинство пунктов должны применяться одинаково).
Кристиан Клэйсон
@ChristianClason, справедливо: p
Ник
Спасибо за ваше редактирование, хотя это на самом деле не сужает вещи. Я не уверен, что можно сказать больше, чем уже дано в ответах на вопрос, связанный выше.
Кристиан Клэйсон
2
Кроме того, вопрос о компиляторах является отдельной проблемой и должен быть отдельным вопросом. (В противном случае люди, знакомые с Fortran, но не заинтересованные в Python, не увидят его.) Некоторые рекомендации уже приведены в scicomp.stackexchange.com/questions/8617 .
Кристиан Клэйсон
1
Если вы знаете matlab, вы можете изучить большинство численных алгоритмов, реализовав их там, хотя ваша производительность почти всегда будет хуже, чем встроенные процедуры matlab. Оттуда вы можете решить, что вам нужно для производительности и перейти на более эффективную библиотеку / язык.
Годрик Провидец

Ответы:

29

Простота обучения

Python и Fortran - относительно простые в изучении языки. Вероятно, легче найти хорошие учебные материалы по Python, чем хорошие учебные материалы по Фортрану, потому что Python используется более широко, и Фортран в настоящее время считается «специальным» языком для числовых вычислений.

Я считаю, что переход с Python на Fortran будет проще. Python является интерпретируемым языком, поэтому количество шагов, необходимых для запуска вашей первой программы, меньше (откройте интерпретатор, введите print("Hello, world!")в командной строке), чем для Fortran (напишите программу «Hello world», скомпилируйте, запустите). Я также думаю, что есть лучшие материалы для обучения объектно-ориентированному стилю на Python, чем на Fortran, и на GitHub доступно больше кода Python, чем на Fortran.

Начало работы с Windows

Установка Python должна быть менее болезненной; Есть доступные дистрибутивы Windows. Я рекомендую использовать научный дистрибутив, такой как Anaconda или Enthought Canopy. Там на самом деле нет компилятора; переводчик берет эту роль. Вы захотите использовать интерпретатор на основе 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-1000 раз больше. Так что, если вы хотите использовать 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, но этого проще избежать.

Личные мнения

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

Большая часть кода на Фортране, который я видел, была безобразна, главным образом потому, что большая часть компьютерного научного сообщества, кажется, не знает или не склонна к каким-либо лучшим методам, обнаруженным разработчиками программного обеспечения за последние 30 лет. Для остроумия: в Фортране нет хорошей платформы для юнит-тестирования (Лучшее, с чем я столкнулся, это FUnit от NASA, и он больше не поддерживается.) Есть несколько хороших платформ для модульного тестирования Python, хорошие генераторы документации по Python и, как правило, множество лучших примеров хороших практик программирования.

Джефф Оксберри
источник
Очень красивый и полный ответ :). Я вчера установил Linux, где уже присутствовал python-компилятор. Теперь мне стало интересно, существует ли простой способ обмена файлами между моей машиной с Linux и Windows? Я заметил, что всякий раз, когда я использую флешку для передачи данных, и машина Windows, и Linux игнорируют определенные части (которые отформатированы в NFTS-формате).
Ник
и моя последняя проблема решена с помощью FAT32-формата (пока, по крайней мере).
Ник
Примечание: FAT32 имеет ограниченный максимальный размер файла.
meawoppl
@Meawoppl, есть ли более удобный способ обмена файлами между Linux и Windows? Может дропбокс тогда? Есть ли также аппаратное решение?
Ник
Держите ваши файлы под 4 ГБ: P На самом деле, я не знаю хорошего решения. Существует также некоторая дерпость в соглашениях об именах файлов. Я помню, как однажды нарушил поддержку некоторых окон, назвав файл <3.txt, что сделало M $ довольно печальным лицом. Поддержка NTFS в linux сейчас довольно хорошая, но в OSX она совершенно запрещена. Я действительно думал, что мы бы уже решили эту проблему.
Meawoppl
7

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

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

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

C ++ является (по моему скромному мнению) счастливым медиумом. С такими библиотеками, как Armadillo или Eigen, вы можете использовать довольно высокий уровень кодирования, одновременно получая низкоуровневый стиль исполнения.

Говоря о производительности, единственным реальным выбором для числового Python сейчас является CPython. Если вы скачаете что- то вроде WinPython, вы также получите большинство необходимых вам библиотек.

Для Фортрана на окнах все немного сложнее. Я бы порекомендовал перейти на Linux и использовать компилятор gfortran или Intel. По моему опыту, Ifort быстрее работает с числовым кодом, но бесплатен только для некоммерческого, не академического использования.

Подводя итог: если вы не хотите запускать действительно тяжелые симуляции, то Python - гораздо более легкий выбор и с ним гораздо приятнее работать. Он также должен быть достаточно быстрым для большинства проектов студенческого уровня. Если вам нужна более высокая производительность, начните с изучения большого количества уже написанных библиотек и позвольте этому выбрать ваш язык. Если вам нужно писать вещи с нуля, используйте C ++.

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

Отказ от ответственности: я физик, который провел довольно много времени с кодами Монте-Карло на основе Fortran 77 и в настоящее время выполняет всю свою обработку данных в Python.

LKlevin
источник
Что касается распараллеливания, исследователи успешно использовали Python параллельно на десятках тысяч ядер с хорошей параллельной эффективностью. (Например, PyClaw был запущен на всех шахинах, которые имеют более 65 000 ядер.)
Джефф Оксберри
1
Ну, это возможно, но, насколько мне известно, только убедившись, что параллельная часть происходит вне CPython, что требует значительных усилий. Параллельная часть PyClaw (PETSc) написана, например, на Си. Другая альтернатива - запуск нескольких экземпляров CPython, но это не совсем тривиально.
Л.Клевин
Большинство параллельных приложений нетривиальны. Вы писали: «Распараллеливание [Python] довольно ужасно, что делает его недостаточным для высокопроизводительных численных вычислений». Никто не пишет высокопроизводительный код на чистом Python. Обоснование этого решения не имеет ничего общего с параллелизмом и не делает недействительным использование Python в качестве языка интерфейса в высокопроизводительных вычислениях, если он используется надлежащим образом. Ваша цитата - соломенный человек, который объединяет вопросы параллелизма, высокой производительности и интерпретируемых языков; никто компетентный не будет проектировать такое приложение.
Джефф Оксберри
Я согласен, что Python является отличным языком интерфейса практически для любых целей, но это отходит от вопроса. Большинство приложений нетривиальны, проблема здесь в том, что все случаи распараллеливания, в том числе тривиальные, нетривиальны в Python. Это может быть неприятно, если ваша проблема хорошо описана в терминах операций Numpy или Cython. Нет, вы не будете использовать это на кластере с ядром 65000, но вы можете принять удвоение производительности на 100 ядрах.
Л.Клевин
Несмотря на параллелизм, хорошая вещь в Fortran состоит в том, что помимо MPI / OpenMP есть также Co-массивы, которые теперь являются частью стандарта. Например, посмотреть jolts.stanford.edu/72/...
Staļi
7

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

Современный Fortran (90 и более поздние версии) - это быстрый и высокий уровень с почти MATLAB-подобным синтаксисом. Так что вы можете делать такие вещи, как:

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

или

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

или даже проще

indx=indxmap(indx,2)

и т.п.

В Linux есть несколько бесплатных компиляторов Фортрана. я использую

  1. НКУ
  2. Солярис Студио
  3. Open64
  4. Intel (только для некоммерческого использования)

Я не использую Mac / OSX, но есть бесплатный PGI.

И, пожалуйста, не используйте FORTRAN 77. Никто не использует его для написания нового кода.

Отказ от ответственности: я лично посмотрел на Python для написания своего собственного небольшого неструктурированного кода FE (построенного на основе PETSc), но объем работ / кодирования был больше, чем просто написание его на чистом языке Fortran 95.

Stali
источник
1
К этому я бы добавил, что вы можете заниматься довольно серьезным объектно-ориентированным программированием в Fortran 2003; посмотрите, например, это руководство . Я часто использую его в своем собственном коде, и это очень эффективно для того, что я хочу сделать. Многие люди скажут вам избегать этого - я говорю, держите себя открытым, вам это может сильно понравиться. Я конечно делаю.
Даниэль Шаперо
4

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

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

Сравнение сводится к производительности : я делал масштабные вычисления только с использованием скомпилированных языков (C ++ и Fortran 90), но никогда с Python. Другой поток дает больше информации о производительности интерпретируемых и скомпилированных языков: Какой язык я должен использовать при преподавании курса бакалавриата по компьютерному программированию?

Лично мне нравится работать с Python в целом, особенно для постобработки. Программирование на Python - это весело!

SAAD
источник
1
Производительность почти всегда важна. Недостаток внимания к производительности - вот почему людям нужны 8 ядер с 16 ГБ ОЗУ для проверки электронной почты и работы в Интернете.
Стали
Я имел несчастье, когда мне приходилось читать чужой код на python. Я бы не классифицировал py-код как легко читаемый.
Бисваджит Банерджи
@stali: я полностью согласен
SAAD
1
@BiswajitBanerjee: невозможно написать сложный код на любом языке, но, по крайней мере, я легко могу определить входы и выходы любой функции, вот где Fortran становится ужасным! :)
SAAD
3

С Python вам не нужен Gnuplot, вы можете использовать, например, matplotlib и / или использовать оболочку IPython. IPython - это интерактивная оболочка Python, которая в режиме% pylab предоставляет практически те же команды построения графиков, которые доступны в MATLAB.

Вполне вероятно, что в ближайшие 5 лет научные вычисления в значительной степени перейдут от MATLAB к Python.

jolvi
источник
Одним из преимуществ Gnuplot является то, что он почти всегда устанавливается на компьютерах с Linux (кластер / серверы и т. Д.) И очень полезен для быстрой / грязной работы. Это как ви для ви.
Стали
1

Я бы продолжал использовать MATLAB, он вызывает быстрые математические библиотеки, и вы не увидите большой разницы в производительности, переключившись на FORTRAN в Windows. В то же время у вас будет лучшая инфраструктура в MATLAB для составления отчетов о результатах и ​​выполнения вашего кода. Недостатком MATLAB является его стоимость. FORTRAN в основном бесплатный, и есть множество бесплатных библиотек.

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

Я бы порекомендовал Python, только если вам нравится программирование. Подумайте об этом: когда вы пишете решение проблемы физики, вам нравится программировать часть решения? Если вы это сделаете, то Python является вариантом, потому что язык намного лучше, чем MATLAB.

Аксакал
источник
2
Ваше утверждение о различиях в производительности при переходе с MATLAB на Fortran в целом неверно. Фортран хорош, если вы пишете код, для которого массивы являются естественной структурой данных, если вы можете жить с тем, как он обрабатывает ввод / вывод, и если у него есть нужные вам библиотеки. Числовые библиотеки в Python сильно перекрываются по функциональности с MATLAB, и я считаю, что проще писать интерфейсы Python для кода C, чем интерфейсы MATLAB для кода C.
Джефф Оксберри
Иногда вы действительно видите большую разницу. Недавно я переписал программу физического моделирования из Matlab (используя пакет bvp6c для внутреннего использования) в Fortran 2008 (используя пакет bvp_solver для внутреннего использования), и время выполнения сократилось до 1,4% после переключения, хотя я не менял алгоритмы или общая структура программы. Для моделирования, которое раньше требовало ~ 3,5 дня на каждую точку данных, чтобы сходиться, это было очень заметным улучшением.
Джабирали