Где выполнять числовые вычисления в Python или Fortran

Почему все больше научных вычисления сейчас переписываются с Fortran на Python, хотя Python является медленным языком. В этой статье разберемся, почему Python становится популярным даже в области числовых вычислений.

Python — медленный язык

Python имеют репутацию медленного языка. Программы, на нем написанные, значительно медленнее, чем программы на Fortran или C. Весь Интернет наполнен статьями: почему Python такой медленный. Но такова природа интерпретируемых языков.

Да, чистый Python намного медленнее, чем Fortran

Но в научных вычислениях не полагается на чистый Python. Он используется как некий промежуточный слой. Например, самая популярная библиотека для научных вычислений является NumPy, которая так и называется “Numeric Python”. Вычисления в нем происходят на C/C++ или Fortran. При этом Python указывает, что нужно получить, т.е. язык выступает в роли декларирующего, как SQL.

Поэтому оценка производительности должна осуществляться при использовании этих библиотек. Ниже на рисунке показано время выполнения операции нахождения попарного расстояния между точками (асимптотическое время выполнения занимает O(M2*N), где M и N — это размерности двух векторов). Как видим, чистый Python проигрывает любой своей библиотеки, причем на 2–3 порядка.

Барный график, который показывает время выполнения операции на чистом Python и его библиотек
Время выполнения операции нахождения расстояний

Популярность в поисках Google

Нужно ли полагаться на популярность? Например, тренды в Гугл показывают, что популярность NumPy растет по сравнению с Fortran, начиная с 2015 года. При этом молодые программисты более чаще ищут информацию о NumPy.

Тренды по запрос в Google Fortran и NumPy
NumPy популярнее Fortran

Также нужно понимать, что NumPy необязательно используется в приложениях с научными вычислениями. Все знают, например, что массивы NumPy намного быстрее встроенных списков Python, поэтому их можно использовать хоть в веб-приложениях.

Можно подумать следующее: “Fortran — очень быстрый и подходит для высокопроизводительных систем. Python — достаточно медленный и требует изучения специальных библиотек, поэтому не всегда подходит для научных вычислений. Зачем вообще тогда переходить на Python?” Давайте разберемся с этим вопросом.

Притча: одна история и два языка

Computer vision на Python

Код курса
VISI
Ближайшая дата курса
17 октября, 2022
Длительность обучения
40 ак.часов
Стоимость обучения
75 000 руб.

Некий инструмент для работы с 3D-графикой под названием Projector был написан в 2010 году на языке Fortran одним программистом. Назовем программиста Бобом.

Спустя года, около 2016, Боб решил переписать свой проект на Python. Оправдывалось это тем, что его молодой коллега хорошо разбирался в новомодном языке, а вот результат, выдаваемый Fortran и Tcl/Tk был не очень понятен. К тому же, Projector был мало кому понятен и поддерживался только Бобом.

Прожженный программист Боб отметил Python как хлопотный, с непонятной логикой отступов язык, который поддерживается кучкой невежливых молодняков, не забывающих каждый раз указывать, что написанный им код not pythonic. Короче говоря, он был раздражен.

Боб, скрепя зубами, переписал проверенный годами код с Fortran на Python с использованием NumPy (и немного SciPy). Приложение достаточно сложное и производительное.

Боб обнаружил, что для структур данных NumPy и SciPy существует множество оптимизированных функций. Очень удобно, не нужно ничего переписывать самому. Читая документацию, он нашел некий инструмент для работы с 3D, который включал некую структуры данных KDTree. Реализация была достаточно проста для проверки множества проекций за один вечер, все это благодаря объектами SciPy KDTree.

Затем настало время для сравнения производительности. И здесь было самое большое удивление. SciPy KDTree выполнялись в 100 раз быстрее, чем реализация на Fortran! Были лишь незначительные разночтения в точности.

Скорость vs гибкость

Что здесь случилось? Основная операция в Projector включает поиск точек в 3D-пространстве. Версия Fortran делала это путем обычного прохода по массиву, что имеет сложность O(n). А вот KDTree — такая структура данных, поиск точек которой занимает O(log(n)). Если n — это 1 миллиард, то преимущество KDTree несомненно.

Конечно, реализация KDTree на Fortran была бы быстрее. Но Боб — это не тот программист, который знает огромное количество алгоритмов и структур данных. Как и многие, он легко оперирует такими базовыми структурами данных, как массивы, списки, бинарные деревья и графы. У него степень PhD в области численных эмуляций сжатых турбулентных реактивных потоков, у него уже много знаний в информатике. Но знать такую специфичную структуру данных он не обязан.

Языки высокого уровня предоставляют много возможностей. В версии с Fortran’ом у Боба не было инструментов вроде KDTree, он полагался только на свои умения. С другой стороны библиотеки Python сняли нагрузку с плеч Боба, дав то, чего нет в Fortran.

Хотя современный Fortran наполнен различными фичами, высокоуровневые конструкции делают разработку намного быстрее, а иногда и полезной, как это случилось с Бобом.

Computer vision на Python

Код курса
VISI
Ближайшая дата курса
17 октября, 2022
Длительность обучения
40 ак.часов
Стоимость обучения
75 000 руб.

А о том, как писать на современном Python высокопроизводительный код для задач Data Science и Big Data вы узнаете на наших образовательных курсах в лицензированном учебном центре обучения и повышения квалификации руководителей и IT-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве:

Добавить комментарий

Поиск по сайту