Julia и Python —языки программирования, которыми я очень дорожу. Использование Julia вместо Python обладает множеством преимуществ, таких как меньшее время написания кода и более быстрая компиляция. Однако на данный момент Julia проигрывает Python в популярности. В отличие от Python в Julia отсутствует критическая инфраструктура машинного обучения и выполнения скриптов, необходимых для того, чтобы стать отраслевым стандартом, особенно в машинном обучении.
Контейнеры в Julia как правило запутаны, излишне модулированы и плохо документированы в отличие от доступных контейнеров Python, зачастую разрабатываемых более крупными организациями, а не инженерами, занимающимися разработкой из дома. Scikit-Learn — одна из наиболее популярных библиотек Python — разработана на конкурсе “Google Summer of Code”, а Tensorflow был создан непосредственно в Google.
Незаслуженно низкая популярность Julia ставит очень интересный вопрос:
Где уместен язык Julia?
Является ли Julia просто подручным Python, не имеющим собственной базы кода, или же она, возможно, напарник Python, используемый скорее как Scala для управления воркерами и развёртывания алгоритмов машинного обучения корпоративного уровня? Scala — язык, который большинство учёных боится использовать, даже несмотря на его длинную историю и обширную библиотеку контейнеров. Всё потому, что Scala является существенно более сложным языком для выполнения трудоёмких задач, и зачастую требуется немалое время для реализации того, что можно сделать на Python в четыре раза быстрее.
Несмотря на эти недостатки, сейчас Scala является важным языком для многих учёных, работающих с данными. Подливает масла в огонь то, что Scala — производный от Java и содержит все ошибки вычисления и манипуляций над числами с плавающей точкой. В Julia нет этих проблем, и, в отличие от Scala, на нём легко писать. Он прост в запуске и при этом поддерживает скорость, необходимую для языка, обрабатывающего большие данные.
Я считаю это отличным направлением для развития языка, поскольку маловероятно, что Python в ближайшее время окажется невостребованным. Хотя на данный момент не похоже, что разработчики языка выбрали это направление, учитывая, что контейнеры в Julia в большинстве своём испорчены PyCalls, который делает Julia невероятно медленным из-за его интерпретации Python.
Это ужасный дефект и упущенная возможность, потому что, хотя Python безусловно медленнее Julia, его место в машинном обучении гораздо прочнее, чем у Scala. Я знаю гораздо больше инженеров, использующих Python, а не Scala.
Поэтому легко предположить, что цель Julia не в том, чтобы заменить Scala, а в том, чтобы заменить Python. Отсюда и девиз:
“Выглядит как Python, летает как C”
(Не уверен, что они всё ещё используют этот старый девиз).
Как я подчеркнул выше, Julia безусловно мог бы заполнить довольно значительный разрыв между Python и Scala. Во-первых, используя PyCall.jl для импорта модулей Python, во-вторых, обрабатывая большие данные аналогично Scala. Нельзя сказать, что использование Julia в качестве предпочтительного языка для машинного обучения и статистики не целесообразно, но с точки зрения замены Python довольно маловероятно. Python — великолепный язык, который позиционирует себя как самый популярный язык в мире.
Распространено заблуждение, отчасти из-за этого девиза, что Julia и Python по сути один и тот же язык, что весьма далеко от истины. Важно помнить, что у людей, не знакомых с R, Lisp, Nimrod или подобными языками, могут возникнуть трудности с соблюдением и пониманием функциональной парадигмы, особенно исходящей из Python.
Хотя синтаксис Julia безусловно очень похож на синтаксис Python, уже в конструкторе видны различия:
# Julia
mutable struct my_type
data
end
class my_type:
data
Хотя на первый взгляд они и кажутся похожими, важно помнить, что структура — это совершенно другой тип данных, нежели класс. Важное отличие между структурой и классом заключается в том, как функции применяются к типам. Чтобы использовать функцию с диспетчеризацией или параметрическим полиморфизмом в структуре, данные нужно передавать через метод, а в классе функцию можно задать как дочернюю этого типа. Это довольно существенное структурное различие, и понятно, почему оно может слегка раздражать тех, кто работал с Python.
Кроме того, Julia в целом сложнее, чем Python, и содержит много синтаксиса, просто не имеющего смысла для обычного программиста на Python.
То есть у нас есть язык, который немного сложнее Python, но ощутимо быстрее. Отсутствие чёткого направления, думаю, может стать наибольшей проблемой, с которой столкнётся такой язык, и именно от этого в целом страдает Julia. В нём есть пакеты, ориентированные на оптимизацию, а также порты для SDL2 и GTK3+, но в то же время нет компилируемых исполняемых файлов, что делает эти пакеты почти бесполезными для всего, кроме программирования для развлечения. В Julia также есть множество пакетов машинного обучения, но зачастую они используют PyCall.jl, поэтому я задался вопросом:
Почему бы просто не использовать Python?
Для меня не имеет большого смысла использование более медленной версии того же пакета на другом языке только ради использования конкретно этого языка.
Из сотен специалистов по данным, которых я знаю, постоянно используют Julia только двое. Я спросил их, что они думают о текущем состоянии этого языка, в каком направление он был бы полезен, и они в унисон ответили:
“Я бы хотел видеть меньше PyCall, больше пакетов машинного обучения и более чёткое направление для языка.”
Безусловно, это основные проблемы Julia, так как недавно я узнал, что они оба используют PyCall Pandas.py вместо Julia’s DataFrames.jl, что иллюстрирует необходимость лучшего модуля для облегчения задач.
Сейчас я вижу максимальное использование Julia в выполнении скриптов бэкенда, что является неудачным применением этого фантастического языка, на котором я пишу каждый день. Julia определённо стоит использовать для запросов и конечных точек для перемещения больших объёмов данных для применения в Python. Проблема с этим назначением заключается в том, что HTTP.jl package в Julia недостаточно хорош для выполнения этой работы. Вдобавок Genie.jl довольно часто глючит, а в Python того же самого можно добиться значительно проще. Когда я сталкиваюсь с таймаутами, я думаю, что Julia определённо мог бы сделать что-то получше, чтобы вытащить меня из
“крупной неприятности с получением запроса.”
Хотя я определённо люблю язык Julia, на данный момент существуют проблемы, которые необходимо решить, чтобы язык мог двигаться дальше. Во-первых, я был бы рад видеть пакеты, не испорченные PyCall. Я работал над этим некоторое время, с примерами вы можете ознакомиться в моём Github.
Julia способен делать действительно интересные вещи и полностью изменить наш подход к машинному обучению, но для того, чтобы это сработало, нужно сделать некоторые изменения в направлении, базе и доступных внутри языка модулях. Вот довольно простые вещи, которые могли бы сделать Julia гораздо более конкурентоспособным:
В целом, без этих базовых улучшений и изменений Julia останется менее полезным языком, чем Python. Целевым направлением Julia не должно быть изобретение колеса и потеря всех замечательных вещей, построенных на низком уровне из-за отсутствия модулей. Остаётся только надеться, что со временем язык и его библиотеки будут становиться только лучше, и работа с Julia без Python станет целесообразной.
Перевод статьи Emmett Boudreau: Is Julia’s Place Co-Existence With Python?
Комментарии