Знакомство с Юлией

Для тех из вас, кто не знает, Julia — это многопарадигмальный (полностью императивный, частично функциональный и частично объектно-ориентированный) язык программирования предназначен для научных и технических (читай числовых) вычислений. Он обеспечивает значительный прирост производительности по сравнению с Python (при использовании без оптимизации и векторных вычислений с использованием Cython и NumPy). Время разработки сокращается в среднем в 2 раза. Прирост производительности колеблется в диапазоне от 10x до 30x по сравнению с Python (R еще медленнее, поэтому мы не включаем его. R не был создан для скорости). В отраслевых отчетах 2016 г. указывалось, что язык Julia обладает высоким потенциалом и, возможно, шансом стать лучшим вариантом для науки о данных, если он получит поддержку и признание сообщества. Что ж, два года спустя версия Julia 1.0 была выпущена в августе 2018 года (версия 1.0), и она получила поддержку сообщества программистов и была принята рядом компаний (см. https://www.juliacomputing.com) в качестве предпочтительного языка для многих областей, включая науку о данных.

Из https://blog.simos.info/learning-the-julia-computer-language-on-ubuntu/

Хотя он имеет много общего с Python (и R) и различными другими языками программирования, такими как Go и Ruby, есть несколько основных факторов, определяющих Джулию. кроме остальных участников конкурса:

Преимущества Юлии

  1. Производительность

По сути, Julia — это компилируемый язык, а Python и R — интерпретируемые. Это означает, что код Julia выполняется непосредственно на процессоре как исполняемый код. Существуют оптимизации, которые можно выполнить для вывода компилятора, но которые нельзя выполнить с помощью интерпретатора. Вы можете возразить, что Python, реализованный на C в виде пакета Cython, можно оптимизировать до уровней производительности, подобных Julia, а также оптимизировать, если вы хорошо знаете язык. Но реальный ответ на вопрос о производительности заключается в том, что Julia дает вам скорость, подобную C, без оптимизации и ручных методов профилирования. Если такая производительность доступна без оптимизации, в первую очередь, зачем использовать Python? Juia вполне может стать решением всех ваших проблем с производительностью.

Сказав это, Джулия все еще подросток в том, что касается роста и зрелости развития языка программирования. Некоторые операции, такие как ввод-вывод, приводят к довольно резкому падению производительности, если они не управляются должным образом. Исходя из опыта, я предлагаю, если вы планируете реализовывать проекты в Julia, выбирайте Jupyter Notebooks, работающие под управлением Julia 1.0 в качестве ядра. IDE Juno в редакторе Atom является рекомендуемой средой, но отсутствие отладчика является серьезным недостатком, если вы хотите использовать код Julia в рабочей среде в среде, подобной Visual Studio.Jupyter позволяет вам разрабатывать свой код по одной функции за раз и обеспечивает легкий доступ к любым значениям переменных и массивов, которые вам нужно "наблюдать". Экосистема Julia имеет активное и широкое сообщество, разрабатывающее ее, но поскольку обновление до версии 1.0 произошло менее полугода назад, не все пакеты в Julia из версии 0.7 были полностью перенесены, так что вы можете придумать что-то странное проблема с версией пакета при установке необходимых пакетов для вашего проекта.

Использование ноутбука HPC (от Unsplash)

2. Поддержка графического процессора

Это напрямую связано с производительностью. Некоторые пакеты, такие как TensorFlow.jl и MXNet.jl, прозрачно поддерживают поддержку графических процессоров. Для разработчиков в 2018 году, уже использующих чрезвычайно мощные графические процессоры для различных приложений с CUDA или майнингом криптовалюты (просто два распространенных примера), это огромный бонус, и повышение производительности может достигать от 100 до 1000 раз для определенных операций и конфигураций. Если вам нужна определенная мощность графического процессора, Джулия предоставит вам такие библиотеки, как cuBLAS.jl и cuDNN.jl для конкретных поставщиков и CUDANative.jl для ручного программирования и поддержки GPU. В Julia также возможно низкоуровневое программирование CUDA с помощью CUDAdrv.jl и библиотеки времени выполнения CUDArt.jl. Очевидно, что Джулия вышла далеко за рамки стандартной поддержки и возможностей графического процессора. И пока вы читаете эту статью, активное сообщество работает над расширением и совершенствованием поддержки графических процессоров для Julia.

3. Плавное обучение и обширная встроенная функциональность

Юлия удивительно проста в освоении и удобна в использовании. Если вы программируете на Python, вы будете чувствовать себя с Джулией как дома. В Джулии все является выражением, и есть базовая поддержка функционального программирования. Функции более высокого порядка поддерживаются простым присваиванием (=) и оператором функции -› (лямбда в Python, =› в C#). Поддержка многомерных матриц отличная — функции для пакетов BLAS и LINPACK включены в пакет LinearAlgebra стандартной библиотеки. Во время инициализации строки разделяются запятой (,), а столбцы — точкой с запятой (;). Транспонирование матриц, сопряжение, факторизация, матричное деление, идентичность, нарезка, решение системы линейных уравнений, триангуляция и многие другие функции выполняются одним вызовом функции отсутствуют. Поддержка даже неровных многомерных матриц доступен. Отсутствует, ничего, любой, все, isdef, istype, oftype, hash, Base как родительский класс для каждого объекта Julia, isequal и даже undef (для представления неинициализированных значений) — это лишь некоторые из множество ключевых слов и функций, доступных для повышения читабельности вашего кода. Другие примечательные функции включают встроенную поддержку арифметики произвольной точности, комплексных чисел, словарей, наборов, битовых строк, битовых массивов и конвейеров. Я только что поцарапал поверхность здесь. Обширная встроенная функциональность – одна из лучших функций Julia, а также множество легкодоступных и хорошо задокументированных модулей.

4. Многократная рассылка

Это основная функция языка программирования Julia. Множественная отправка или функциональность нескольких методов в основном означает, что функции могут вызываться динамически во время выполнения, чтобы вести себя по-разному в зависимости от не только переданных аргументов (что называется функцией перегрузка) и вместо этого может изменяться в зависимости от объектов, передаваемых в него динамически во время выполнения. Эта концепция тесно связана с шаблонами разработки стратегии и шаблонов в объектно-ориентированной терминологии. Мы можем изменять поведение программы в зависимости от любого атрибута, а также от вызывающего объекта и объектов, передаваемых в функцию во время выполнения. Это одна из убойных особенностей языка Julia. Можно передать любой объект функции и, таким образом, динамически изменять ее поведение в зависимости от малейших изменений в ее реализации, и во многих случаях стандартная библиотека построена вокруг этой концепции. Некоторые статистические данные исследований показывают, что среднее количество строк стандартного кода, необходимое в сложной системе, сокращается в три или более раз (!) благодаря такому выбору языковой конструкции. Это значительно упрощает разработку очень сложных программных систем без какого-либо непредсказуемого или ошибочного поведения. Поэтому неудивительно, что Джулия теперь получает признание, которое заслужила.

5. Поддержка распределенных и параллельных вычислений

Julia прозрачно поддерживает параллельные и распределенные вычисления с использованием нескольких топологий. Существует поддержка сопрограмм, как в языке программирования Go, которые представляют собой вспомогательные функции, работающие параллельно на многоядерных архитектурах. Предусмотрена обширная поддержка потоков, а примитивы синхронизации были тщательно разработаны для обеспечения максимальной производительности и сведения к минимуму риска возникновения условий гонки. С помощью простых текстовых макросов и декораторов/аннотаций, таких как @Parallel, любой программист может написать код, который выполняется параллельно. Поддержка OpenMP также присутствует для выполнения параллельного кода с директивами компилятора и макросами. С самого начала своего существования Julia был языком, предназначенным для поддержки высокопроизводительных вычислений с одновременным выполнением нескольких рабочих процессов. И это делает его намного проще в использовании для параллельных вычислений, чем, скажем, Python, у которого всегда была GIL (глобальная блокировка интерпретатора для потоков) как серьезная проблема с производительностью.

6. Взаимодействие с другими языками программирования (C, Java, Python и т. д.)

Julia может вызывать код C, Go, Java, MATLAB, R и Python, используя встроенные функции-оболочки — фактически каждый широко используемый сегодня язык программирования поддерживает совместимость с Julia. Это значительно упрощает работу с другими языками. Единственное существенное отличие состоит в том, что в Julia индексы массивов начинаются с 1 (как и в R), тогда как во многих других языках они начинаются с 0 (C, C++, Java, Python, C# и многие другие). Поддержка взаимодействия делает жизнь разработчика Julia намного проще и легче, чем если бы вы работали на Python или C++/Java. В реальном мире обращение к другим библиотекам и пакетам является частью повседневной рутины специалиста по обработке и анализу данных — частью повседневной рутины разработчика. Пакеты с открытым исходным кодом имеют здесь преимущество, поскольку они могут быть изменены по мере необходимости для вашей проблемной области. Совместимость со всеми основными языками программирования — одно из самых сильных преимуществ Джулии.

Основы программирования 🙂

Текущие недостатки

Джулия все еще развивается, несмотря на выпуск 1.0. На производительность, главный аргумент в пользу продажи, сильно влияет использование глобальных переменных, и первый запуск программы всегда медленнее по сравнению с выполнением, следующим за первым. Основным разработчикам языка Julia необходимо поработать над системой управления пакетами и, что особенно важно, над переносом всех сторонних библиотек на версию 1.0. Поскольку это произойдет со временем при активном участии сообщества (что-то вроде перехода с Python 2.7 на 3.6, но с гораздо меньшими трудностями), эта проблема со временем решится сама собой. Кроме того, язык должен быть более последовательным для производительности на старых устройствах. Устаревшие системы без качественных графических процессоров могут столкнуться с трудностями при запуске Julia только с вычислительной мощностью ЦП.(ГП не требуются, но настоятельно рекомендуются для запуска Julia и для оптимальной производительности разработчика, особенно для библиотек глубокого обучения, таких как Knet (библиотека Julia для нейронных сетей и глубокого обучения ). Включение поддержки Unicode 11.0 может стать неожиданностью для тех, кто к этому не привык, а манипуляции со строками могут стать головной болью. Поскольку языку Julia нужно немного повзрослеть, вы также должны использовать профилировщик для выявления и устранения возможных узких мест производительности в вашем коде.

Вывод

Поэтому вы можете задать себе вопрос: если вы — компания, проводящая курсы по R и Python, зачем вам публиковать статью, в которой пропагандируется другой язык для науки о данных? Просто. Если вы новичок в науке о данных и программировании, изучение Python и R — лучший способ немедленно приступить к изучению текущей отрасли (это скорее похоже на изучение C до C++). А Python и R никуда не денутся в ближайшее время. Поскольку существует как обширная кодовая база, так и множество существующих фреймворков и производственного кода, которые работают на Python и, в меньшей степени, на R, спрос на специалистов по данным, которые хорошо разбираются в Python, будет простираться далеко в будущее. Так что да, стоит потратить время на изучение Python и R. Кроме того, Julia еще не принята в масштабах всей отрасли (хотя есть много евангелистов Julia, которые активно ее продвигают — см., например, www.stochasticlifestyle.com). Ожидайте, что еще как минимум десять лет Python будет основным игроком в области науки о данных.

Более того, языки программирования никогда полностью не исчезают. COBOL был разработан комитетом под руководством Грейс Хоппер в 1959 году и пятьдесят лет спустя по-прежнему остается популярным языком программирования для мэйнфреймов. Учитывая это, можно ожидать повсеместного использования Python и R будет оставаться на рынке еще как минимум два десятилетия.Даже если более 70% специалистов по науке о данных обратятся к Джулии как к первому выбору для науки о данных, существующая кодовая база Python и R не исчезнет в ближайшее время. . Julia также требует большей зрелости как языка (как уже упоминалось) — некоторые функции работают медленнее, чем Python, где реализация не была оптимальной и хорошо протестированной, особенно на старых устройствах. Следовательно, до зрелости Джулии как языка программирования может пройти год или два. Итак, читая эту статью, вы поймете, что Python и R — необходимые навыки для того, чтобы стать профессиональным специалистом по данным прямо сейчас. Но — познакомьтесь с Джулией в свободное время. Всего наилучшего!

Чтобы изучить большие данные, пройдите Онлайн-курс по науке о данных от Dimensionless Technologies.

Чтобы узнать больше о больших данных, нажмите, чтобы прочитать Блог о больших данных.