[Перевод] Matlab vs. Julia vs. Python
Я использовал MATLAB более 25 лет. (А до этого я даже использовал MATRIXx, земля ему пухом.) Это не первый язык, на котором я научился программировать, но это тот язык, с которым я достиг математического совершеннолетия. Знание MATLAB было полезным для моей карьеры.
Тем не менее, невозможно игнорировать рост Python в научных вычислениях. MathWorks должен чувствовать то же самое: они не только добавили возможность вызывать Python напрямую из MATLAB, но и заимствовали некоторые его языковые функции, такие как более агрессивную передачу для компонентов бинарных операторов.
Наступил момент, когда я подверг сомнению мое постоянное использование MATLAB как в исследованиях, так и в преподавании. Тем не менее я столько вложил в материалы, что было трудно найти мотивацию, чтобы научиться чему-то новому.
Статья переведена при поддержке компании EDISON Software, которая заботится о здоровье программистов и их завтраке, а также разрабатывает программное обеспечение на заказ.
Учебник по вводным основам MATLAB, который я написал в соавторстве для вычислительной математики. Книга содержит более 40 функций и 160 вычислительных примеров, и она охватывает то, что, я думаю, является основополагающим в использовании MATLAB для численных научных вычислений. Отчасти для самосовершенствования, а отчасти для повышения полезности книги в этом году я решил перевести код на Julia и Python. Этот опыт привел меня к особым взглядам на три языка в отношении научных вычислений, которые я пытаюсь описать ниже.
Я отложу вопросы стоимости и открытости. MATLAB, в отличие от Python и Julia, не свободно распространяемый продукт. Это грандиозное различие — для некоторых, но я хочу рассмотреть технические достоинства. В течение многих лет MATLAB выходил далеко за рамки любого бесплатного продукта по ряду очень полезных способов, и если вы хотите быть продуктивными, тогда стоимость будет адской. Это отдельное обсуждение платонической привлекательности языка и экосистемы.
Если опустить вопросы, связанные со стоимостью, причина многих различий этих языков связана с их происхождением. MATLAB первым делом ставил в приоритет математический аспект, а именно вычислительную математику. Python, появившийся в 1980-х, во главу угла ставил информатику. Julia, созданная в 2009, поставила целью достижение баланса между двумя предыдущими языками.
MATLAB
Первоначально каждое значение в MATLAB представляло собой массив чисел с плавающей запятой двойной точности. Оба аспекта этого выбора, массивы и числа с плавающей точкой, были вдохновленными проектными решениями.
Стандарт IEEE 754 для чисел с плавающей запятой не был принят до 1985 года, а память измерялась в килобайтах, а не в гигабайтах. Двойные числа с плавающей запятой были не самым эффективным способом отображения символов или целых чисел, но они были тем, что ученые, инженеры и все математики хотели использовать большую часть времени. Кроме того, переменные не должны быть объявлены и память не должна быть распределена. Позволив компьютеру справиться с этими задачами и избавившись от типов данных, вы освободили свой мозг, чтобы подумать об алгоритмах, которые будут работать с данными.
Массивы важны, потому что численные алгоритмы в линейной алгебре принимали свои собственные формы LINPACK и EISPACK. Но доступ к ним со стандартным носителем в научных вычислениях, FORTRAN 77, был многоэтапным процессом, который включал объявление переменных, вызов скрытых имен подпрограмм, компиляцию кода, а затем анализ данных и выходных файлов. Запись умножения матриц в виде A * B и распечатка ответа сразу же привели к изменила ход игры.
MATLAB также сделал графику простой и открытой. Никаких сложных машинно-зависимых библиотек с низкоуровневыми вызовами, просто plot (x, y), и вы видели то, что видел бы кто-нибудь еще с MATLAB. Было еще больше инноваций, таких как запутанные комплексные числа, разреженные матрицы, инструменты для создания кроссплатформенных графических пользовательских интерфейсов и передовой набор решателей ODE, которые сделали MATLAB местом для научных вычислений со скоростью мысли.
Однако дизайн, который был идеальным для интерактивных вычислений, даже длинных, не всегда способствовал написанию хороших и производительных программ. Перемещение данных между многими функциями требовало манипулирования множеством переменных и частой обращению к документации о входных и выходных аргументах. Одна функция на файл на диске в плоском пространстве имен была очень простой для маленького проекта, но головной болью для большого. Определенные шаблоны программирования (векторизация, предварительное распределение памяти) должны были применяться, если вы хотите избежать проблем со скоростью вычислений. Научные вычисления в настоящее время применяются к гораздо большему количеству областей с огромным количеством различных типов данных. И т.п.
В ответ MathWorks продолжила внедрять инновации в MATLAB: встроенные функции, вложенные функции, замыкающие переменные, многочисленные типы данных, объектно-ориентированные функции, инфраструктуры модульного тестирования и так далее. Каждое нововведение было, вероятно, решением важной проблемы. Но накопление 40 лет этих изменений имело побочный эффект размывания простоты и единства концепции. В 2009 году я написал книгу, которая довольно хорошо освещала основы MATLAB менее чем на 100 страницах. Насколько я знаю, все эти вещи все еще доступны. Но вам нужно знать намного больше сейчас, чтобы назвать себя профессионалом.
Python
Отчасти, история Python является зеркальным отражением истории MATLAB. В обоих языках присутствовала интерактивная командная строка (сейчас ее называют REPL аббревиатура от read-eval print loop, что переводится как петля прочтения-оценка-печать, а также свобода от различных объявлений и компиляций. Однако MatLab был создан в первую очередь с прицелом на вычислительный анализ, в то время как python создавался для хакеров. Затем, каждый из языков смог расширить свою базу пользователей путем обновлений и расширений функционала.
На мой взгляд, Python все еще страдает от бедности своего математического аппарата. В нем присутствуют такие неудобные мелочи как наличие ** вместо^, @ используется для умножения матриц (было добавлено недавно!), не размер, а форма матрицы, хранилище, ориентированное на ряды и т.д. Если вы считаете, что V.conj ().T@D**3@V элегантнее V∗D3V, тогда скорей всего у вас не все в порядке с головой. Также индексирование у него начинается с 0 (вместо 1). Мне доводилось ознакомится с противоположным мнением, однако, на мой взгляд, оно не так уж и убидительно, Очевидно, что все это вопрос личных предпочтений, предмет священных войн в интернете, так как ты всегда можешь привести громоздкий пример в свою пользу, Что мне точно кажется убидительным, так это то, что в течение десятилетий математическое индексирование векторов и матриц мы всегда начинаем с 1, и многие псевдо-коды основаны на этом предположении.
Помимо некоторых неудобств, я нахожу систему Python+NumPy+SciPy громоздкой и непостоянной, наглядным примером является тот факт, что несмотря на сильную ориентированность на объект, там существуют матричные классы, и при этом их использование не рекомендуется, Возможно это меня так MatLab избаловал, но я считаю матрицы важным объектом который следует держать под рукой и активно использовать. Разве не является основной фишкой ООр возможность использовать * для того чтобы совершать различные операции с массивами и матрицами? Вообще, в этом плане там присутствует множество неудачных моментов, (Зачем мне вообще нужна команда spslove? Почему я просто не могу применить команду solve к разреженной матрице? И там еще много такого.)
Есть также места, где численная экосистема выглядит немного хуже. Например, квадратные и ODE-решатели выглядят минималистичным в 2019 году. насколько я могу сказать не существует методов для DAE, DDE, симплектических или неявных решателей, которые допускают внутренние итерации Крылова. Посмотрите, этим функциям в основном 30 или более лет — они все еще хороши, но очень далеко от совершенства. Matplotlib — удивительный пакет для работы, и в некоторых случаях он выглядел лучше, чем MATLAB, но мне не хватает 3D.
Некоторые эксперты утверждают, что существуют причины, по которым код Python пытается бороться со скорость выполнения с помощью компилируемых языков. Меня удивляет результат поиска «python он слишком медленный». Чемпионы Python приводят множество аргументов / извинений, которые люди делали для MATLAB в те времена. Это не значит, что они не правы, но это больше, чем просто проблема восприятия.
Я понимаю, почему Python был настолько захватывающим для многих людей в научных вычислениях. Он имеет некоторый синтаксис и мощь MATLAB, доступный из REPL. Он обладает отличными инструментами и хорошо работает с другими языками и областями вычислений. Он предложил это бесплатно и с гораздо лучшей долгосрочной воспроизводимостью. Очевидно, что это хорошо работает для многих людей, которые, вероятно, видят мало причин для перемен.
Из-за того, что я знаю, как делать в научных вычислениях, Python заставляет делать больше рутинной работу по изучению и использованию, чем я привык. Какое-то время мы не будем знать, будет ли оно продолжаться в сообществе или уже приблизилось к своему пику.
Julia
У Julia есть свои преимущества и недостатки, так как она запоздала. Я восхищаюсь создателями Julia за то, что они понимали, что они могли добиться большего
Мы хотим язык с открытым исходным кодом, с библиотекой лицензией. Мы хотим скорость C с динамикой Ruby. Мы хотим, чтобы язык был гомоионный, с настоящими макросами, такими как Lisp, но с очевидными, знакомыми математическими обозначениями, такими как в Matlab. Мы хотим что-то такое же удобное для программирования, как Python, такое же простое для статистики, как R, такое же естественное для обработки строк, как Perl, такое же мощное для линейной алгебры, как Matlab, и способное склеивать программы вместе как оболочку. Нечто простое в освоении, но при этом радует самых серьезных хакеров. Мы хотим, чтобы он был интерактивным, и мы хотим, чтобы он был скомпилирован.
Я считаю, что в значительной степени они преуспели. К релизу версии 1.0 они, казалось, немного отличались от REPL, и от MATLAB. (Насколько точно LinRange лучше, чем linspace?) Хотя это придирки.
Это первый язык, который я использовал, с возможностью выходить за рамки ASCII. Я получаю черезмерное удовлетворение от использования таких переменных, как Фи, и таких операторов, как ≈. Это больше, чем красивая обертка; возможность больше походить на математические выражения, которые мы пишем, является реальным плюсом, хотя это немного усложняет обучение и документацию.
Работа в Julia показала мне, что я приобрел некоторые навыки программирования из-за выбора MATLAB, а не из-за присущего ей превосходства. Векторизация не является естественной для многих вещей. Julia открывает, что вы можете векторизовать любую функцию, просто добавив точку к ее имени. Построение матрицы с помощью comprehension делает вложенные циклы (или трюки с сеткой сетки) похожими на ошибочные кнуты в сравнении, и обход матрицы в целом с помощью генератора для простого суммирования напоминает получение чего-то даром. (Я знаю, что Python имеет схожие языковые функции.)
Большая особенность множественной диспетчеризации делает некоторые вещи намного проще и понятнее, чем ориентация объекта. Например, предположим, что у вас есть классы Wall и Ball на традиционном объектно-ориентированном языке.Какой класс должен обнаружить столкновение шара со стеной? Или вам нужен класс комнаты, чтобы играть в рефери? Подобные вопросы могут отвлечь меня. При многократной диспетчеризации данные упаковываются в типы объектов, но методы, работающие с данными, не привязаны к классу. Так
function detect_collision (B: Ball, W: Wall)
знает о типах, но определяется независимо от них. Мне потребовалось немало программирования, чтобы понять, насколько интересно и потенциально важно понятие множественной диспетчеризации для расширения языка.
Численная экосистема быстро развивается. Мой пример номер один — DifrentialEquations.jl, написанный замечательным Крисом Ракауцкасом. Если это программное обеспечение не выиграет приз Уилкинсона в ближайшее время, система сломана. Просто зайдите на сайт и приготовьтесь к обращению.
Я еще не видел больших успехов в скорости над MATLAB, которые обещает Джулия. Отчасти это моя относительная неопытность и виды задач, которые я выполняю, но отчасти потому, что MathWorks проделал невероятную работу по автоматической оптимизации кода. Во всяком случае, это не тот аспект кодирования, на котором я сосредоточен большую часть времени.
Программирование в Юлии заняло у меня некоторое время, чтобы чувствовать себя комфортно (возможно, я просто старею и становлюсь кристаллизованным). Это заставляет меня думать о типах данных больше, чем хотелось бы, и всегда есть подозрение, что я упустил правильный способ что-то сделать. Но для ежедневного использования я, скорее всего, сейчас обращусь к Джулии, как к MATLAB.
Итог
MATLAB — это корпоративное решение, в основном использующееся для решения инженерных задач. Он остается наиболее простым инструментом, позволяющим решать числовые задачи. Важную роль в этом, несомненно, играет очень подробная документация и десятилетнее развитие компании.
MATLAB — как седан BMW из мира научных вычислений. Это дорого, даже перед тем когда вы будете говорить об аксессуарах.(наборе инструментов). Вы платите за безупречную, бесперебойную работу и сервис. Но также это привлекает непропорциональное количество ненависти.
Python — это пикап Ford. Это вездесущее и любимое многими (в США). Он может делать все, что вы хотите, и он создан для того, чтобы делать то, чего не могут другие автомобили. Скорее всего, вы захотите его сейчас и потом. Но это не дает вам большой опыта вождения.
Julia — это Тесла. Она построена со смелой целью изменить будущее, и это возможно. Но это также может стать просто упоминанием. В то же время вы получите, где вы находитесь на стиле, и с большим запасом сил.